Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 实现BLoCs的widget是否一定是statefulwidget?_Dart_Flutter_Bloc - Fatal编程技术网

Dart 实现BLoCs的widget是否一定是statefulwidget?

Dart 实现BLoCs的widget是否一定是statefulwidget?,dart,flutter,bloc,Dart,Flutter,Bloc,我不熟悉集团模式,出现了一个我在其他地方找不到的问题。使用Flatter_bloc库,我可以访问BlocBuilder小部件,只要bloc的状态发生变化,它就会重新生成。因为我处理的是独立于框架的状态,所以有必要将父窗口小部件声明为有状态的,比如说包含来自一个BLoC的数据的卡吗 我已经能够成功地将BlocBuilders作为有状态和无状态小部件的子部件来实现,但是我还无法决定哪种是最佳实践,或者是否有任何情况需要有状态 我想我应该说,如果不需要更新BlocBuilder之外的任何内容,那么无状

我不熟悉集团模式,出现了一个我在其他地方找不到的问题。使用Flatter_bloc库,我可以访问BlocBuilder小部件,只要bloc的状态发生变化,它就会重新生成。因为我处理的是独立于框架的状态,所以有必要将父窗口小部件声明为有状态的,比如说包含来自一个BLoC的数据的卡吗

我已经能够成功地将BlocBuilders作为有状态和无状态小部件的子部件来实现,但是我还无法决定哪种是最佳实践,或者是否有任何情况需要有状态

我想我应该说,如果不需要更新BlocBuilder之外的任何内容,那么无状态是可以的,但是如果要添加RefreshIndicator之类的内容,并且必须为其实现逻辑并有条件地将事件传递给BLoC,那么就需要有状态。对吗

我相信我在这里解释得太多了,但本着这种精神,我在下面提供了一些代码,如果它有助于理解我的问题的话

下面是一个与我的项目相关的简化无状态实现:

类WeatherCard扩展了一个小部件{ ///您可以假设以下情况正在发生: ///1父窗口小部件中有一个BlocProvider ///将执行此天气预报卡。 /// ///2 WeatherBloc中的WeatherLoaded状态提供 ///包含所有数据的WeatherModel的实例 ///来自天气API。 /// @凌驾 小部件构建上下文上下文{ 回程卡 孩子:BlocBuilder bloc:BlocProvider.ofcontext, 生成器:BuildContext上下文,WeatherState状态{ 如果状态为WeatherLoading{ 返回文本“正在加载…”; }否则,如果状态为WeatherLoaded{ 返回Textstate.weatherModel.temp.toString; }否则{ 返回文本'Error!'; } } ; } } 以及有状态实现:

//您可以在这里做出与无状态实现相同的假设。 类WeatherCard扩展StatefulWidget{ @凌驾 _WeatherCardState createState=>\u WeatherCardState; } 类_WeatherCardState扩展状态{ @凌驾 小部件构建上下文上下文{ 回程卡 孩子:BlocBuilder bloc:BlocProvider.ofcontext, 生成器:BuildContext上下文,WeatherState状态{ 如果状态为WeatherLoading{ 返回文本“正在加载…”; }否则,如果状态为WeatherLoaded{ 返回Textstate.weatherModel.temp.toString; }否则{ 返回文本'Error!'; } } ; } }
通过使用Bloc,您应该能够避免几乎完全声明有状态的小部件,尽管使用有状态的小部件或其他状态管理策略当然是可能的,有时也是有意义的

如果您有条件地将逻辑传递给BUC,您可能需要考虑将条件逻辑移动到BUC本身,并只传递触发条件语句的事件。 当然,也可以在bloc中声明多个流,在UI中声明多个streambuilder来监听同一个bloc,尽管我不知道使用flift_bloc库是否可行。如果您使用的是flatter_bloc,那么看起来每个bloc只能有一个流。您也可以使用描述的策略/BlocProvider


对于UI中不会对程序逻辑产生任何/太大影响的一些小更改,使用有状态小部件来处理状态可能比将状态保留在块中更容易。并不是所有情况都有一个正确或错误的答案,从长远来看,什么更容易构建和维护取决于您。但是,如果保持体系结构的一致性,您的程序可能更容易阅读,也更容易找到您想要更改的内容。因此,如果您使用bloc,这意味着处理bloc中的所有状态,并完全或几乎完全使用无状态小部件构建UI

通过使用Bloc,您应该能够避免几乎完全声明有状态的小部件,尽管使用有状态的小部件或其他状态管理策略当然是可能的,有时也是有意义的

如果您有条件地将逻辑传递给BUC,您可能需要考虑将条件逻辑移动到BUC本身,并只传递触发条件语句的事件。 当然,也可以在bloc中声明多个流,在UI中声明多个streambuilder来监听同一个bloc,尽管我不知道使用flift_bloc库是否可行。如果您使用的是flatter_bloc,那么看起来每个bloc只能有一个流。您还可以使用strategy/BlocProv 艾德描述了这一点

对于UI中不会对程序逻辑产生任何/太大影响的一些小更改,使用有状态小部件来处理状态可能比将状态保留在块中更容易。并不是所有情况都有一个正确或错误的答案,从长远来看,什么更容易构建和维护取决于您。但是,如果保持体系结构的一致性,您的程序可能更容易阅读,也更容易找到您想要更改的内容。因此,如果您使用bloc,这意味着处理bloc中的所有状态,并完全或几乎完全使用无状态小部件构建UI