代码之家  ›  专栏  ›  技术社区  ›  Shady Aziza

TextField focus/unfocus强制重新创建我的BloC

  •  0
  • Shady Aziza  · 技术社区  · 7 年前

    我有以下设置:

    class PagesContainer extends StatelessWidget{
    final PageController _pCont = PageController();
      @override
      Widget build(BuildContext context) {
    
        return BlocProvider(
          bloc:ExampleBloc(),
              child: PageView(
              // physics: NeverScrollableScrollPhysics(),
              controller: _pCont,
              children: [
                Screen1(),
                Screen2(),
              ]),
        );
      }}
    
    class ExampleBloc extends Bloc{
    ExampleBloc(){
      print('Bloc is initialized');
    }
    
      @override
      void dispose() {
        // TODO: implement dispose
      }
    
    }
    
    
    class Screen1 extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        final bloc = BlocProvider.of<ExampleBloc>(context);
        return Scaffold(
          body: TextField()
        );
      }
    }
    
    class Screen2 extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new Container();
      }
    }
    

    每当我点击聚焦/取消聚焦 TextField 在里面 Screen1 ExampleBloc 我可以看到 print('Bloc is initialized'); 在每个焦点/非焦点事件上执行一次又一次。我怎样才能阻止这个集团的这种再创造呢?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Shady Aziza    7 年前

    在…的帮助下 Rémi PageContainer 解决了我的问题:

    Reference answer can be found here for more elaboration

    class PagesContainerState extends State<PagesContainer> {
      ExampleBloc _bloc;
    
    final PageController _pCont = PageController();
    @override
      void initState() {
        _bloc=ExampleBloc();
        super.initState();
      }
      @override
      Widget build(BuildContext context) {
    
        return BlocProvider(
          bloc:_bloc,
              child: PageView(
              // physics: NeverScrollableScrollPhysics(),
              controller: _pCont,
              children: [
                Screen1(),
                Screen2(),
              ]),
        );
      }}