3

flutter_bloc状態管理にパッケージを使用しています。検索画面を作成したいのですが、showSearchFlutter 関数が見つかりました。実装で作成したBLoCインスタンスにインスタンスを提供する際に問題が発生しています。私は最終的にそれを機能させましたが、これを行うための最良の方法は何ですか. コードは次のとおりです (内の に配置されたボタンから始まる抜粋):ListViewSearchDelegateAppBarScaffold

class ItemSearchButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return IconButton(
      icon: Icon(Icons.search),
      onPressed: () {
        final itemListBloc = context.bloc<ItemListBloc>();
        showSearch(
          context: context,
          delegate: _ItemSearchDelegate(itemListBloc),
        );
      },
    );
  }
}

class _ItemSearchDelegate extends SearchDelegate<String> {
  final ItemListBloc itemListBloc;

  _ItemSearchDelegate(this.itemListBloc);

  // other overridden methods

  @override
  Widget buildSuggestions(BuildContext context) {
    return BlocProvider.value(
      value: itemListBloc,
      child: ItemListWidget(),
    );
  }
}

基本的に、showSearchメソッドを呼び出すコンテキストには正しい BLoC インスタンスがありますが、.NET でSearchDelegate明示的に再提供しない限り、実装内では使用できませんbuildSuggestions

BLoC がデフォルトで使用できないのはなぜですか? 関数はshowSearch内部的に newNavigator Routeをプッシュしますが、これは問題ですか?

このようなものに対処する標準的な方法は何ですか?

4

2 に答える 2

1

はい、ルートが変わればbuildContextまた変わります。したがって、そのブロックを新しいコンテキストに提供する必要があります。ナビゲートしたい場所でページをラップするだけですBlocProvider

Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => 
BlocProvider(create: Mybloc(),child:MyPage()); 
于 2020-05-23T15:30:50.427 に答える