Flutter:如果存在则获取提供者,否则返回 null 而不是异常

标签 flutter bloc flutter-provider flutter-bloc

当我们使用 BlocProvider.of<OrderBloc>(context)访问 Bloc 对象,如果没有 OrderBloc 则返回异常存在于当前上下文的祖先小部件上。返回异常如下:

No ancestor could be found starting from the context that was passed to BlocProvider.of<OrderBloc>().
但是我要退货null而不是异常时没有 OrderBloc存在于祖先小部件上。考虑以下场景:
var orderBloc = BlocProvider.of<OrderBloc>(context);

return Container(child: orderBloc == null
      ? Text('-')
      : BlocBuilder<OrderBloc, OrderState>(
          bloc: orderBloc,
          builder: (context, state) {
            // build something if orderBloc exists.
          },

        ),          
);

最佳答案

你可以像这样用 try/catch 包裹那一行:

var orderBloc;
try {
  orderBloc = BlocProvider.of<OrderBloc>(context);
} catch (e) {}

return Container(child: orderBloc == null
  ? Text('-')
  : BlocBuilder<OrderBloc, OrderState>(
      bloc: orderBloc,
      builder: (context, state) {
        // build something if orderBloc exists.
      },
    ),          
);
编辑:
如果你想减少样板文件:
extension ReadOrNull on BuildContext {
  T? readOrNull<T>() {
    try {
      return read<T>();
    } on ProviderNotFoundException catch (_) {
      return null;
    }
  }
}
那么你的代码将是:
var orderBloc = context.readOrNull<OrderBloc>();

return Container(child: orderBloc == null
  ? Text('-')
  : BlocBuilder<OrderBloc, OrderState>(
      bloc: orderBloc,
      builder: (context, state) {
        // build something if orderBloc exists.
      },
    ),          
);

关于Flutter:如果存在则获取提供者,否则返回 null 而不是异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67332788/

相关文章:

http - flutter:内容类型必须是 application/json

listview - 如何在flutter中使我的文本与listview.builder一起滚动

design-patterns - 选择正确的 Flutter 设计模式

firebase - Flutter Provider显示来自错误用户的数据

flutter auto_route |如何使用 BlocProvider 包装路由?

flutter - flutter -具有底部文本字段的容器

flutter - 如何在Flutter中实现徒手图像裁剪?

flutter - 使用 go_router 和 bloc 在 context.pop() 之后刷新 View

flutter - 使用 Hydrated Bloc 版本 5 及更高版本的持久状态

flutter - 在 Flutter 中使用 Provider 更新和动画化 AnimatedList