我是BLoC模式的新手,并且出现了一个我无法在其他地方找到的问题。使用flutter_bloc库,我可以访问BlocBuilder小部件,只要BLoC的状态发生变化,它就会重建。由于我独立于框架处理状态,是否有必要将父窗口小部件(比如包含来自BLoC的数据的卡)声明为有状态?
我已经能够成功地将BlocBuilders作为有状态和无状态小部件的子项来实现,但我无法确定哪种是最佳做法,或者是否有任何需要有状态的情况。
我想如果你不需要在BlocBuilder之外更新任何东西,我会在正确的轨道上说无状态是好的,但是你需要有状态,如果你要添加类似RefreshIndicator的东西并且必须为它实现逻辑(并有条件地将事件传递给BLoC)。那是对的吗?
我确信我在这里过分解释,但本着这一点,我提供了一些代码,如果它有助于理解我的问题。
这是一个简化的无状态实现,与我的项目有关:
class WeatherCard extends StatelessWidget {
/// You can assume that the following is happening:
/// 1) There is a BlocProvider in the parent widget which
/// will implement this WeatherCard.
///
/// 2) The WeatherLoaded state in the WeatherBloc provides an
/// instance of a WeatherModel which contains all of the data
/// from a weather API.
///
@override
Widget build(BuildContext context) {
return Card(
child: BlocBuilder(
bloc: BlocProvider.of<WeatherBloc>(context),
builder: (BuildContext context, WeatherState state) {
if (state is WeatherLoading) {
return Text('Loading...');
} else if (state is WeatherLoaded) {
return Text(state.weatherModel.temp.toString());
} else {
return Text('Error!');
}
}
);
}
}
有状态的实施:
// You can make the same assumptions here as in the Stateless implementation.
class WeatherCard extends StatefulWidget {
@override
_WeatherCardState createState() => _WeatherCardState();
}
class _WeatherCardState extends State<WeatherCard> {
@override
Widget build(BuildContext context) {
return Card(
child: BlocBuilder(
bloc: BlocProvider.of<WeatherBloc>(context),
builder: (BuildContext context, WeatherState state) {
if (state is WeatherLoading) {
return Text('Loading...');
} else if (state is WeatherLoaded) {
return Text(state.weatherModel.temp.toString());
} else {
return Text('Error!');
}
}
);
}
}
通过使用Bloc,您应该能够避免几乎完全声明有状态小部件,尽管它当然是可能的,有时使用有状态小部件或其他状态管理策略也是有意义的。
如果您有条件地将逻辑传递给bloc,您可能需要考虑将条件逻辑移动到bloc本身并且只传递触发条件的事件。
也可以在集团中声明多个Streams,并且UI中的多个StreamBuilder监听同一个Bloc,但我不知道flutter_bloc库是否可以实现。如果您使用的是flutter_bloc,则看起来每个块仅限于一个Stream。您也可以使用描述here的strategy / BlocProvider代替。
对于没有任何/很多影响程序逻辑的UI中的一些小变化,使用有状态小部件来处理状态可能比将状态保持在Bloc中更容易。对于所有情况都没有正确或错误的答案,由您来决定从长远来看哪些更容易构建和维护。但是,如果保持架构的一致性,您的程序可能会更容易阅读并更容易找到您想要更改的内容。所以,如果你正在使用bloc,这将意味着处理Blocs中的所有状态并完全或几乎完全由无状态小部件构建你的UI。