当我专注于TextField - Bloc Pattern时,Widget会重新渲染

问题描述 投票:1回答:1

我正在使用BLoC来保持两个嵌套的FullScreenDialogs之间的状态。

当我按下第一个屏幕时,我正在初始化集团,就像这样

return FloatingActionButton(
      child: Icon(Icons.add),
      onPressed: () {
        Navigator.of(context).push(MaterialPageRoute(
          builder: (BuildContext context) => ProductBlocProvider(child: ProductEntryScreen()),
          fullscreenDialog: true
        ));
      },
    );

ProductEntryScreen有一堆TextFields和一个按钮,而不是打开一个新的FullScreenDialog。这个新的屏幕也有TextFields。我遇到的问题是,每当我在第二个TextField上写一个FullScreenDialog时,我启动ProductBlocProvider的onPressed函数再次运行。

重新运行导致Bloc创建一个新实例,所以我最终失去了状态。

我想做的事?也许我做错了所以我会解释我想要实现的目标。

我希望在填充所有字段时保持两个FullScreenDialogs之间的状态,当我完成时,我想按下一个按钮,将所有数据(两个屏幕)发送到数据库。

dart flutter
1个回答
2
投票

问题是我在MaterialPageRoute的构建器函数中创建了提供程序中的bloc实例。

正在重复调用该构建器函数,并且每次都创建一个新的bloc实例。解决方案是从builde函数中取出bloc实例的创建,如下所示:

return FloatingActionButton(
      child: Icon(Icons.add),
      onPressed: () {
        //Here I create the instance
        var _bloc = ProductBloc();
        Navigator.of(context).push(MaterialPageRoute(
          //And I pass the bloc instance to the provider
          builder: (BuildContext context) => ProductBlocProvider(bloc: _bloc, child: ProductEntryScreen()),
          fullscreenDialog: true
        ));
      },
    );
© www.soinside.com 2019 - 2024. All rights reserved.