使用 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 编码方式的代码。
我是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 编码方式的代码。