使用 BlocProvider 并实例化 BLoC

Use of BlocProvider and instantiating the BLoC

我是Flutter的新手,最近开始学习BLoC模式。

我不明白为什么我需要在小部件内部使用 BlocProvider.of(context) ,在这里我可以简单地在所有小部件所依赖的文件之上实例化一个 Bloc (final blocX = bloc(); ),即使没有在任何代码中定义单个 BlocProvider。

非常感谢。

class HomePageInit extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: BlocProvider(
        builder: (context) => WeatherBloc(),
        child: Homepage(),
      ),
    );
  }

然后在同一文件内,在任何 class 或小部件之外:

  final weatherBloc = WeatherBloc(),

然后在小部件里面:

class SubmitButton extends StatefulWidget {
  @override
  _SubmitButtonState createState() => _SubmitButtonState();
}

class _SubmitButtonState extends State<SubmitButton> {
  void submitCityName(String name) {

    weatherBloc.dispatch(GetWeather(name));
  }

你完全正确。您可以使用全局变量,这将达到相同的目的。

但是Flutter的理念是万物皆widget。使用 BlocProvider.of(context) 符合这种理念。有些人甚至可能会说全局变量是邪恶的,但那只是猜测 :)

使用 BlocProvider 小部件的另一个有用之处是它存在于您的小部件树中,并且仅在需要时才构建。然而,全局变量往往会留在那里,即使你不需要它。

因此,我鼓励您使用 BlocProvider 来获得适合全球 FLutter 编码方式的代码。