如何告知Flutter某个可空变量绝不会为空?——解决Consumer组件中ch参数的非空类型断言问题
解决Flutter Consumer中builder回调参数
ch的可空类型问题 这问题我之前开发Flutter时也碰到过,其实有几种简单且安全的方式,能让Dart编译器明确知晓ch参数绝不会为空,直接将其视为Widget类型:
方法1:使用非空断言运算符(!)
这是最直接的方式,通过在ch后面添加!,明确告诉编译器“这个变量肯定不为null”。因为我们已经给Consumer的child参数传入了一个非空的IconButton,所以这个断言是绝对安全的,不会触发运行时空指针错误。
修改后的代码如下:
Consumer<Cart>( builder: (_, cart, ch) => Badge( child: ch!, // 添加非空断言,将Widget?转为Widget value: cart.itemCount.toString(), ), child: IconButton( icon: const Icon(Icons.shopping_cart), onPressed: () { Navigator.of(context).pushNamed(CartScreen.routeName); }, ), )
方法2:使用类型转换(as Widget)
如果你更倾向于显式的类型转换写法,可以用as Widget来强制转换类型,效果和非空断言一致,同样基于我们确定ch不为空的前提:
child: ch as Widget,
额外说明
为什么ch会被标记为Widget??其实是Consumer的源码设计问题——它的builder回调参数定义成了Widget?,但只要你给Consumer的child传了值,这个参数就一定是非空的。所以上面两种方法都不会有任何风险,完全可以放心使用。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

