当我们使用 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/