Flutter使用connectivity_wrapper报List<Widget?>非List<Widget>子类型错误如何解决
Flutter connectivity_wrapper: ^1.0.6 类型转换报错解决方案
List<Widget?> 和 List 的区别
List<Widget>:属于非空泛型列表,Dart空安全规则要求列表内所有元素必须为非空的Widget实例,不允许出现null值。List<Widget?>:属于可空泛型列表,列表内的元素既可以是Widget实例,也可以为null值。
两种类型在Dart类型体系中是完全独立的类型,没有继承关系,无法直接互相强转,强转就会触发类型不匹配报错。
报错根因
该报错是connectivity_wrapper: ^1.0.6版本自身的空安全兼容缺陷导致,库内部遍历子组件树的逻辑存在问题,会误将非空的Widget列表判定为可空的List<Widget?>类型,强制转换为非空List时触发类型校验失败。
修复方案
方案1:强制指定列表类型(最快生效)
在ListView的children属性末尾添加.cast<Widget>(),明确告知Dart该列表为非空Widget列表,修改后的代码如下:
@override Widget build(BuildContext context) { return Scaffold( appBar: appBarCustom( onBackTap: onBackTab, color: Colors.black, title: Strings.appName, textStyle: TextStyles.appBarBold, actions: [ C0(), ], ), body: ConnectivityWidgetWrapper( child: ListView( children: <Widget>[ ListTile( title: Text("EX1"), onTap: () { }, ), Divider(), ListTile( title: Text("EX@"), onTap: () { }, ), Divider(), ].cast<Widget>(), ), ), ); }
方案2:升级依赖版本(根治问题)
升级connectivity_wrapper到更高的稳定版本,后续版本已经修复了该空安全类型转换的bug,直接修改pubspec.yaml中的依赖版本即可。
方案3:外层包裹容器绕开遍历逻辑
将ListView外层套一个Container组件,绕开库内部对列表子组件的遍历逻辑,也可以解决报错:
body: ConnectivityWidgetWrapper( child: Container( child: ListView( // 原有children代码保持不变 ), ), ),
内容的提问来源于stack exchange,提问作者BC TUBE
相关产品推荐
相关产品推荐

