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(控制员));
}
返回容器();
},
);