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

Posted

技术标签:

【中文标题】Flutter:如果存在则获取提供者,否则返回null而不是异常【英文标题】:Flutter: Get Provider if exists otherwise return null instead of exception 【发布时间】:2021-07-23 17:33:47 【问题描述】:

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

No ancestor could be found starting from the context that was passed to BlocProvider.of<OrderBloc>().

但是当祖先小部件上不存在 OrderBloc 时,我想返回 null 而不是异常。考虑以下场景:

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.
          ,

        ),          
);

【问题讨论】:

【参考方案1】:

你可以像这样用 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而不是异常的主要内容,如果未能解决你的问题,请参考以下文章

mysql:如果不存在则插入记录,否则返回记录的ID

Redis 常用命令

Mongoose 如果存在更新则获取集合数据,否则插入

检查表1中是不是存在记录的优化方法。如果没有则检查表2,否则返回默认值

SQL 如果存在则“是”否则“否”在新列中

如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回