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
相关产品推荐
相关产品推荐

