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