Flutter嵌套侧边栏报错:List<Widget>?无法赋值给List<Widget>
解决Flutter嵌套侧边栏的类型错误
错误原因很明确:ExpansionTile的children参数要求传入非空的List<Widget>,但你的_buildSubMenu方法返回的是可空类型List<Widget>?,类型不匹配导致报错。
下面提供两种简单的修复方案:
方案一:修改_buildSubMenu返回非空列表
把_buildSubMenu的返回类型改为非空的List<Widget>,当传入的children为null时返回空列表而非null:
Widget _buildMenuItem(BuildContext context, MenuItem item) { return ExpansionTile( title: Text(item.title), children: _buildSubMenu(context, item.children), ); } List<Widget> _buildSubMenu(BuildContext context, List<MenuItem>? children) { if (children == null) { return []; // 返回空列表替代null } return children.map((child) { if (child.children != null) { return _buildMenuItem(context, child); } else { return ListTile( title: Text(child.title), onTap: () { Navigator.of(context).pop(); // 关闭侧边栏 if (child.routeName != null) { Navigator.pushNamed(context, child.routeName!); } }, ); } }).toList(); }
方案二:调用时用空合并运算符兜底
保持_buildSubMenu方法不变,在给ExpansionTile的children赋值时,用?? []把可能的null转为空列表:
Widget _buildMenuItem(BuildContext context, MenuItem item) { return ExpansionTile( title: Text(item.title), children: _buildSubMenu(context, item.children) ?? [], // 空合并处理null情况 ); } List<Widget>? _buildSubMenu(BuildContext context, List<MenuItem>? children) { if (children == null) { return null; } return children.map((child) { if (child.children != null) { return _buildMenuItem(context, child); } else { return ListTile( title: Text(child.title), onTap: () { Navigator.of(context).pop(); // 关闭侧边栏 if (child.routeName != null) { Navigator.pushNamed(context, child.routeName!); } }, ); } }).toList(); }
两种方案都能解决类型不匹配的问题,推荐方案一,因为它让_buildSubMenu的返回值语义更清晰——无论输入是否为null,都返回一个有效的列表。
内容的提问来源于stack exchange,提问作者NavAsk
相关产品推荐
相关产品推荐

