Flutter/Dart中解决List?无法赋值给List的Widget构建问题
Flutter:解决
List?无法赋值给List的最佳实践 问题背景
从JSON生成options列表的逻辑如下(代码已简化,逻辑正常):
Future getidea(String subject) async { List ideaList = []; for (var idea in ideaListTemp) { List options = []; options.add(idea["A"]); options.add(idea["B"]); options.add(idea["C"]); ideaList.add(ideaItem( idea["ideaText"], idea["ideaMedia"], options, // 注:原代码中的`idea[options]`是错误写法,应直接传options )); } return ideaList; } class ideaItem { final String ideaText; final String ideaMedia; List? options; ideaItem( this.ideaText, this.ideaMedia, this.options, ); }
在使用options构建Widget时,出现错误:error: The argument type 'List?' can't be assigned to the parameter type 'List',相关代码:
Widget build(BuildContext context) { return Expanded( child: SingleChildScrollView( padding: const EdgeInsets.all(_horizontalMargin), physics: const AlwaysScrollableScrollPhysics(), child: Column( children: [ _buildOptions(widget.fromJSON.options), // 此处报错 ], ), ), ); } Widget _buildOptions(List option) { List<Widget> listElevatedButton = []; for (var i = 0; i < option.length; i++) { listElevatedButton.add( Builder( builder: (context) => Padding( padding: const EdgeInsets.all(8.0), child: ElevatedButton( onPressed: () { print('Use the update function'); }, child: Text(option[i]), ), ), ), ); } return Column(children: listElevatedButton); }
最佳解决方案
方案1:确保options始终为非空列表(推荐)
既然从JSON生成时一定会创建options列表,没必要让它成为可空类型,直接修改ideaItem类,强制options为非空:
class ideaItem { final String ideaText; final String ideaMedia; final List options; // 去掉可空标记? // 构造函数设置默认值,确保即使不传也有非空列表 ideaItem( this.ideaText, this.ideaMedia, List? options, ) : options = options ?? []; }
同时修正getidea方法中错误的传参(原代码idea[options]是错误写法,应直接传入options变量):
ideaList.add(ideaItem( idea["ideaText"], idea["ideaMedia"], options, // 直接传已构建好的options列表 ));
这样调用_buildOptions时就不会有可空类型的问题,参数匹配完全正常。
方案2:安全处理可空列表(保留可空类型时使用)
如果需要保留options的可空特性,在调用_buildOptions时做非空处理:
- 方法A:非空断言(确保
options一定不为空时使用)
_buildOptions(widget.fromJSON.options!)
- 方法B:空合并运算符,提供默认空列表
_buildOptions(widget.fromJSON.options ?? [])
方案3:修改_buildOptions方法适配可空参数
调整_buildOptions的参数为可空,内部处理空情况:
Widget _buildOptions(List? option) { // 如果option为空,返回空容器 if (option == null) return const SizedBox.shrink(); List<Widget> listElevatedButton = []; for (var i = 0; i < option.length; i++) { listElevatedButton.add( Builder( builder: (context) => Padding( padding: const EdgeInsets.all(8.0), child: ElevatedButton( onPressed: () { print('Use the update function'); }, child: Text(option[i]), ), ), ), ); } return Column(children: listElevatedButton); }
调用时直接传可空参数即可:
_buildOptions(widget.fromJSON.options)
内容的提问来源于stack exchange,提问作者White Rabbit
相关产品推荐
相关产品推荐

