Flutter Flatter-从父对象访问子对象
我有一个父窗口小部件,它有两个块:Flutter Flatter-从父对象访问子对象,flutter,bloc,flutter-bloc,Flutter,Bloc,Flutter Bloc,我有一个父窗口小部件,它有两个块: ... @override Widget build(BuildContext context) { return MultiBlocProvider( providers: [ BlocProvider<RestaurantBloc>( create: (BuildContext context) => RestaurantBloc(restaurantRepository: _r
...
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider<RestaurantBloc>(
create: (BuildContext context) => RestaurantBloc(restaurantRepository: _restaurantRepository),
),
BlocProvider<CartBloc>(
create: (BuildContext context) => CartBloc(),
),
],
child: RestaurantScreenWidget(),
);
}
...
然后它生成各种各样的子窗口小部件。这些小部件需要访问CartBloc
及其状态:
...
Padding(
padding: EdgeInsets.only(top: 20),
child: SizedBox(
width: double.infinity,
child: BlocBuilder<CartBloc, CartState>(
builder: (context, cartState) {
return RaisedButton(
child: const Text('ADD TO BASKET'),
color: Colors.blue,
textColor: Colors.white,
onPressed: () {
BlocProvider.of<CartBloc>(context).add(
AddItemToCart(
itemCount: (state as ItemLoaded).amount,
itemPrice: args.itemPrice,
newItemId: args.itemId,
newItemRestrictions: (state as ItemLoaded).restrictions,
newItemName: args.itemName
)
);
Navigator.pop(context);
},
);
}
),
),
),
...
。。。
填充物(
填充:仅限边缘设置(顶部:20),
孩子:大小盒子(
宽度:double.infinity,
孩子:BlocBuilder(
生成器:(上下文,cartState){
返回上升按钮(
子项:常量文本(“添加到篮子”),
颜色:颜色,蓝色,
textColor:Colors.white,
已按下:(){
BlocProvider.of(上下文)。添加(
加法器(
itemCount:(状态为ItemLoaded)。金额,
itemPrice:args.itemPrice,
newItemId:args.itemId,
newItemRestrictions:(状态为ItemLoaded)。限制,
newItemName:args.itemName
)
);
Navigator.pop(上下文);
},
);
}
),
),
),
...
但这样做会产生错误:
但是,如果我在子窗口小部件上放置一个带有CartBloc
的MultiBlocProvider
,错误就会消失,但显然父窗口小部件不共享子窗口小部件的状态
如何处理这两个小部件之间需要共享的状态?(generate child窗口小部件推送到需要访问CartBloc及其状态的屏幕上)。这是一个非常常见的错误。使用
BlocBuilder
小部件时,必须将bloc实例赋予它“build”。您可以通过在BlocBuilder
中设置可选的“bloc”构造函数属性来完成此操作
BlocBuilder<CameraBloc, CameraState>(
bloc: CameraBloc(),
builder: (context, state) {
if (state is InitialCameraState) {
return Container(
child: AspectRatio(
aspectRatio: controller.value.aspectRatio,
child: CameraPreview(controller)));
}
return Container();
},
);
BlocBuilder(
集团:CameraBloc(),
生成器:(上下文、状态){
如果(状态为InitialCameraState){
返回容器(
孩子:AspectRatio(
aspectRatio:controller.value.aspectRatio,
儿童:CameraPreview(控制员));
}
返回容器();
},
);
这是一个很常见的错误。使用BlocBuilder
小部件时,必须将bloc实例赋予它“build”。您可以通过在BlocBuilder
中设置可选的“bloc”构造函数属性来完成此操作
BlocBuilder<CameraBloc, CameraState>(
bloc: CameraBloc(),
builder: (context, state) {
if (state is InitialCameraState) {
return Container(
child: AspectRatio(
aspectRatio: controller.value.aspectRatio,
child: CameraPreview(controller)));
}
return Container();
},
);
BlocBuilder(
集团:CameraBloc(),
生成器:(上下文、状态){
如果(状态为InitialCameraState){
返回容器(
孩子:AspectRatio(
aspectRatio:controller.value.aspectRatio,
儿童:CameraPreview(控制员));
}
返回容器();
},
);