实现BLoCs的小部件是否必须是StatefulWidgets?

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

我是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!');
          }
        }
    );
  }
}


dart flutter bloc
1个回答
2
投票

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

如果您有条件地将逻辑传递给bloc,您可能需要考虑将条件逻辑移动到bloc本身并且只传递触发条件的事件。

也可以在集团中声明多个Streams,并且UI中的多个StreamBuilder监听同一个Bloc,但我不知道flutter_bloc库是否可以实现。如果您使用的是flutter_bloc,则看起来每个块仅限于一个Stream。您也可以使用描述here的strategy / BlocProvider代替。

对于没有任何/很多影响程序逻辑的UI中的一些小变化,使用有状态小部件来处理状态可能比将状态保持在Bloc中更容易。对于所有情况都没有正确或错误的答案,由您来决定从长远来看哪些更容易构建和维护。但是,如果保持架构的一致性,您的程序可能会更容易阅读并更容易找到您想要更改的内容。所以,如果你正在使用bloc,这将意味着处理Blocs中的所有状态并完全或几乎完全由无状态小部件构建你的UI。

© www.soinside.com 2019 - 2024. All rights reserved.