Android pushNamed()屏幕错误的颤振返回数据
我使用pushNamed()从屏幕获取返回数据,如下所示:Android pushNamed()屏幕错误的颤振返回数据,android,flutter,Android,Flutter,我使用pushNamed()从屏幕获取返回数据,如下所示: _pushToPage2() async { String result = await Navigator.pushNamed(context, "/page2"); print("$tag $result"); } 但是代码有问题,这是完整的错误堆栈跟踪: E/flatter:[错误:flatter/shell/common/shell.cc(181)]省道错误:未处理的异常: “MaterialPage路由”类型
_pushToPage2() async {
String result = await Navigator.pushNamed(context, "/page2");
print("$tag $result");
}
但是代码有问题,这是完整的错误堆栈跟踪:
E/flatter:[错误:flatter/shell/common/shell.cc(181)]省道错误:未处理的异常:“MaterialPage路由”类型不是“路由”类型的子类型
0 NavigatorState.\u RouteName(包:flatter/src/widgets/navigator.dart:1408:14)
1 NavigatorState.pushNamed(包:flatter/src/widgets/navigator.dart:1454:20)
2\u我的主页状态。\u推送页面2(file:///Users/wang/flutter_project/flutter_navigation/lib/main.dart:113:50)
3_MyHomePageState.build。(file:///Users/wang/flutter_project/flutter_navigation/lib/main.dart:58:19)
4 InkResponseState.handleTap(包装:颤振/src/材料/墨水well.省道:507:14)
5 _inkrestate.build。(包装:颤振/src/材料/墨水井。省道:562:30)
6 GestureRecognizer.invokeCallback(包:flatter/src/signatures/recognizer.dart:102:24)
7点击手势识别器。\u检查(包装:颤振/src/手势/tap.dart:242:9)
8 TapGestureRecognizer.handlePrimaryPointer(软件包:颤振/src/手势/tap.dart:175:7)
9 PrimaryPointerGestureRecognizer.handleEvent(包:flatter/src/signatures/recognizer.dart:315:9)
10点计算机调度(包:颤振/src/手势/pointer\u路由器。dart:73:12)
11 PointerRouter.route(包:flatter/src/signatures/pointer\u router.dart:101:11)
12_WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent(包:flift/src/signatures/binding.dart:143:19)
13_WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent(包:flift/src/signatures/binding.dart:121:22)
14 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent(包装:flift/src/signatures/binding.dart:101:7)
15 _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue(包装:flutt/src/signatures/binding.dart:64:7)
16 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket(包:flatter/src/signatures/binding.dart:48:7)
17_invoke1(省道:ui/hooks.dart:153:13)
18_dispatchPointerDataPacket(dart:ui/hooks.dart:107:5) 但以下代码工作正常:
_pushToPage2() async {
String result = await Navigator.push(
context, MaterialPageRoute(builder: (context) => Page2()));
print("$tag $result");
}
在main.dart文件和主函数define MaterialApp小部件中,我们在其中定义应用程序的路径(屏幕) main.dart:
void main() {
runApp(
new MaterialApp(
home: new Screen1(),
routes: <String, WidgetBuilder> {
'/screen1': (BuildContext context) => new Screen1(),
'/screen2' : (BuildContext context) => new Screen2()
},
)
);
}
屏幕2:
class Screen2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
...
}
}
class Screen2 extends StatelessWidget {
Screen2(this.color);
final Color color;
@override
Widget build(BuildContext context) {
...
}
}
要导航到屏幕,我们需要:
Navigator.of(context).pushNamed('/screen2');
async
和awiat
是不需要的,但如果您正在进行异步编程,例如:;您正在查询Firestore,并根据查询结果选择导航到新屏幕或选择显示错误
有关详细信息:
编辑:
要在屏幕之间传递数据,请将参数传递给Screen2构造函数并使用Navigator.push()
。请记住,在Navigator.pushNamed()
中,只能传递上下文和路由名称,不能在其中传递参数
Navigator.push(context, new MaterialPageRoute(
builder: (BuildContext context) => new Screen2(new Color(0xFF66BB6A)),
));
屏幕2:
class Screen2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
...
}
}
class Screen2 extends StatelessWidget {
Screen2(this.color);
final Color color;
@override
Widget build(BuildContext context) {
...
}
}
对我来说,错误是另一个错误(
type'MaterialPageRoute'不是type'Route'
的子类型),我通过将返回值声明为动态类型来解决它:
dynamic result=wait Navigator.of(context.pushNamed(“/page”);
虽然这会失去一些类型安全性,但对我来说效果很好。只需在路由器中声明
materialpage 2
的工作类型即可
case”/page2:
返回物料路径(…});
我也有同样的问题。最后我找到了一个解决方案。将结果转换为您的类型
例如:
String result=wait Navigator.of(context.pushNamed(“/some\u route”)
上述代码将引发异常
但是,您可以这样做:
_pushToPage2() async {
String result = await Navigator.pushNamed(context, "/page2");
print("$tag $result");
}
final result=wait Navigator.of(context.pushName(“/some_route”)作为字符串;
上面的代码将按预期工作。如何将数据发送回父屏幕?我在您的代码中没有看到类似的内容。我是否遗漏了什么?您正在使用
push()
而不是pushNamed()传递数据
请阅读问题carefully@CopsOnRoad我的回答是,我们不能从pushNamed()传递参数或数据所以,你的答案可能只是一开始的一行,你不能这么做,对不起!@CopsOnRoad好吧,我还看到OP询问了从儿童屏幕获取数据的问题,我在我的回答中显示,你的问题现在已经解决了,还是你需要更多的帮助?我的答案有用吗,帮助你解决了你的问题m?我问了同样的问题,由于没有一个真正有效的答案,我想它不支持返回带有名称的内容在/page
中,如何返回数据?您可以返回类似Navigator.pop(上下文,“任意数据”)的数据;
如何处理数据对象?无需将其序列化为字符串并返回。@没有任何对象可以返回任何需要的对象。它不限于string
。