You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何在两个组件间传递上下文以解决BlocProvider.of()找不到BottomSheetBloc的问题

解决Flutter嵌套组件传递上下文获取Bloc的问题

首先,你遇到的错误核心原因是:子组件_listItemColumn使用的是自身的上下文,这个上下文并没有被BottomSheetBloc的BlocProvider覆盖;而父组件_getRow里BlocBuilder的上下文是包含该Bloc的,所以我们只需要把这个父级上下文传递给子组件即可,下面是两种常用且可行的实现方式:

方法一:直接将父组件上下文作为参数传入子组件

这是最直观且推荐的方式,只需要修改子组件的参数定义,调用时传入父级上下文即可:

步骤1:修改子组件_listItemColumn的参数

添加required BuildContext context参数,并且在调用BlocProvider.of时使用这个传入的上下文:

Widget _listItemColumn({ 
  required BuildContext context, // 新增上下文参数
  required String name, 
  required String fullAddress, 
  required String id, 
}) {
  return Column(
    children: [
      Padding(
        padding: const EdgeInsets.fromLTRB(
          Margins.medium, 
          Margins.tiny, 
          Margins.tiny, 
          Margins.small
        ),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          mainAxisSize: MainAxisSize.max,
          children: [
            Material(
              color: Colorz.white,
              child: InkWrapper(
                splashColor: Colorz.lighterGray,
                child: IconButton(
                  alignment: Alignment.center,
                  icon: SvgPicture.asset(Img.listItemMenu),
                  onPressed: () {},
                ),
                onTap: () {
                  // 使用传入的父级上下文获取Bloc
                  BlocProvider.of<BottomSheetBloc>(context).add(
                    BottomSheetEventOpenRemoveAddress(
                      addressId: id,
                    ),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    ],
  );
}

步骤2:在父组件中调用子组件时传入上下文

在_getRow的BlocBuilder的builder方法里,把当前的context传给_listItemColumn:

return Stack(
  children: [
    progress ? Center(
      child: Container(
        color: Colorz.transparent30,
        child: const PlatformProgressIndicator()
      ), 
    ) : const EmptyWidget(),
    // 传入父级上下文
    _listItemColumn(
      context: context,
      name: name, 
      fullAddress: fullAddress, 
      id: id 
    )
  ],
);

方法二:使用Builder组件间接获取父级上下文

如果你不想显式传递上下文参数,可以用Builder组件包裹子组件,Builder会提供一个位于父组件上下文范围内的新上下文,再将其传入子组件:

// 在父组件的Stack中替换子组件的调用
Builder(
  builder: (parentContext) {
    return _listItemColumn(
      context: parentContext,
      name: name, 
      fullAddress: fullAddress, 
      id: id 
    );
  },
)

两种方法都能解决问题,但方法一更清晰易懂,也更符合Flutter的代码习惯,优先推荐使用第一种方式。

内容的提问来源于stack exchange,提问作者Andrii Havrylyak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:07:45