Flutter中在子组件initState双重检查Repository是否非空是否为良好实践?
问题解答
首先得明确:你加的这个非空判断确实是冗余的不良实践,完全没必要保留,也不应该忽略Dart分析器的警告。
为什么这么说?因为RepositoryProvider.of<AuthenticationRepository>(context)这个方法的默认行为是:如果找不到对应的仓库实例,它会直接抛出异常,而不是返回null。所以你写的if(xxx != null)这个条件永远都是true,分析器一眼就看穿了这个逻辑漏洞,才会给出警告。
你既然已经确认整个MaterialApp都被RepositoryProvider包裹了,那直接赋值就行,根本不需要多此一举加判断:
class _LoginScreenState extends State<LoginScreen> { AuthenticationRepository? _authenticationRepository; @override void initState() { super.initState(); // 直接赋值,不用判断 _authenticationRepository = RepositoryProvider.of<AuthenticationRepository>(context); } }
要是你真的想处理“万一找不到仓库”的极端情况,那得用nullOk: true参数让方法返回null,这时候你的非空判断才有意义:
// 加上nullOk参数,找不到时返回null final repo = RepositoryProvider.of<AuthenticationRepository>(context, nullOk: true); if(repo != null) { _authenticationRepository = repo; } else { // 这里处理找不到的情况 }
但既然你百分百确定仓库存在,这种写法反而画蛇添足,会让代码变得啰嗦。
总结一下:删掉那个多余的非空判断,顺着分析器的提示优化代码就行,别给自己加没必要的逻辑负担。
内容的提问来源于stack exchange,提问作者Manas
相关产品推荐
相关产品推荐

