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

Flutter报错:'Object'无法赋值给'Widget?',求助Navigator.pushNamed问题

解决「'Object' can't be assigned to type 'Widget?'」错误

错误原因

你直接把Navigator.pushNamed作为Container的child返回,但这个方法的返回值是Future<Object?>,并非Widget类型,类型不匹配触发了报错。另外还有个细节错误:路由定义里用的是'/Veganeat'(首字母大写),但调用时写的是'veganeat'(全小写),这会导致找不到对应路由。

修复方案

步骤1:统一路由名称大小写

先把路由定义和调用的名称统一,比如都改成小写形式:

// 修改routes中的定义
routes: {
  // ...其他路由
  '/veganeat': (context) => const VeganEat(),
  '/cheeseeat': (context) => const CheEat(),
  // ...其他路由
},

步骤2:将导航逻辑从Widget树中移出

不能在child的三元表达式里直接返回导航方法,应该在状态更新时触发导航,Widget部分只负责显示文本内容:

在你的State类中添加didUpdateWidget方法,监听语音识别结果变化并触发导航:

@override
void didUpdateWidget(covariant YourWidget oldWidget) {
  super.didUpdateWidget(oldWidget);
  if (_speechToText.isListening) {
    if (_lastWords.contains("vegan burger")) {
      // 用addPostFrameCallback确保Widget构建完成后再执行导航
      WidgetsBinding.instance.addPostFrameCallback((_) {
        Navigator.pushNamed(context, '/veganeat');
      });
    } else if (_lastWords.contains("cheese burger")) {
      WidgetsBinding.instance.addPostFrameCallback((_) {
        Navigator.pushNamed(context, '/cheeseeat');
      });
    }
  }
}

然后修改Container代码,只显示提示文本:

Container(
  height: 200,
  width: 400,
  child: _speechToText.isListening
      ? Text(
          _lastWords.contains("vegan burger") || _lastWords.contains("cheese burger")
              ? "正在跳转..."
              : "tell me which burger to order",
        )
      : Text("loading"),
)

额外优化:避免重复跳转

可以添加标志位防止多次识别到关键词时重复跳转:

bool _hasNavigated = false;

@override
void didUpdateWidget(covariant YourWidget oldWidget) {
  super.didUpdateWidget(oldWidget);
  if (_speechToText.isListening && !_hasNavigated) {
    if (_lastWords.contains("vegan burger")) {
      _hasNavigated = true;
      WidgetsBinding.instance.addPostFrameCallback((_) {
        Navigator.pushNamed(context, '/veganeat');
      });
    } else if (_lastWords.contains("cheese burger")) {
      _hasNavigated = true;
      WidgetsBinding.instance.addPostFrameCallback((_) {
        Navigator.pushNamed(context, '/cheeseeat');
      });
    }
  }
}

// 停止监听时重置标志位
void _stopListening() async {
  await _speechToText.stop();
  setState(() {
    _hasNavigated = false;
  });
}

内容的提问来源于stack exchange,提问作者Mitsuki Ryu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:15:42