Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android pushNamed()屏幕错误的颤振返回数据_Android_Flutter - Fatal编程技术网

Android 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路由”类型

我使用pushNamed()从屏幕获取返回数据,如下所示:

_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