You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:51:09