Flutter动态PopupMenu报错:期望PopupMenuItem类型却得到Null
问题场景
我编写了用于创建动态PopupMenu的代码:
PopupMenuButton( itemBuilder: (context) => classifications.map((classificationData) { return (condition)? PopupMenuItem( child: PointerInterceptor( child: menuBuild( classificationData)), ) : // ignore: cast_from_null_always_fails null as PopupMenuItem; }).toList(), )
在Flutter最新版本中出现报错:
Another exception was thrown: Expected a value of type 'PopupMenuItem
', but got one of type 'Null'
之前使用flutter run --no-sound-null-safety运行项目,但现在该方式已不被允许,需要解决这个空安全兼容问题。
解决方法
方法1:过滤生成后的null元素
通过where方法过滤掉map过程中产生的null值,再通过cast转换类型消除空安全警告,确保返回的列表全是有效PopupMenuItem实例:
PopupMenuButton( itemBuilder: (context) => classifications .map((classificationData) { return condition ? PopupMenuItem( child: PointerInterceptor( child: menuBuild(classificationData), ), ) : null; }) .where((item) => item != null) .cast<PopupMenuItem>() .toList(), )
方法2:提前过滤数据源
先对classifications列表进行过滤,只保留符合condition条件的数据,再直接生成PopupMenuItem,从根源避免生成null元素,逻辑更简洁:
PopupMenuButton( itemBuilder: (context) => classifications .where((classificationData) => condition) .map((classificationData) => PopupMenuItem( child: PointerInterceptor( child: menuBuild(classificationData), ), )) .toList(), )
注意事项
不要使用null as PopupMenuItem这种强制转换写法,这本身就是不安全的操作,编译器也会明确提示警告,空安全模式下这种写法会直接触发类型错误,必须彻底移除。
内容的提问来源于stack exchange,提问作者Ammar Kayali
相关产品推荐
相关产品推荐

