使用pushNamed()

时间:2018-10-31 06:09:36

标签: android flutter

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

_pushToPage2() async {
    String result = await Navigator.pushNamed(context, "/page2");
    print("$tag $result");
}

但是代码有问题,这是完整的错误堆栈跟踪:

  

E / flutter:[错误:flutter / shell / common / shell.cc(181)] Dart错误:未处理的异常:
      类型“ MaterialPageRoute”不是类型“ Route”的子类型
      0 NavigatorState._routeNamed(包:flutter / src / widgets / navigator.dart:1408:14)
      1 NavigatorState.pushNamed(包:flutter / src / widgets / navigator.dart:1454:20)
      2 _MyHomePageState._pushToPage2(文件:///Users/wang/flutter_project/flutter_navigation/lib/main.dart:113:50)       
      3 _MyHomePageState.build。 (文件:///Users/wang/flutter_project/flutter_navigation/lib/main.dart:58:19)
      4 _InkResponseState._handleTap(包:flutter / src / material / ink_well.dart:507:14)
      5 _InkResponseState.build。 (包装:flutter / src / material / ink_well.dart:562:30)
      6 GestureRecognizer.invokeCallback(package:flutter / src / gestures / recognizer.dart:102:24)
      7 TapGestureRecognizer._checkUp(包:flutter / src / gestures / tap.dart:242:9)
      8 TapGestureRecognizer.handlePrimaryPointer(包:flutter / src / gestures / tap.dart:175:7)
      9 PrimaryPointerGestureRecognizer.handleEvent(package:flutter / src / gestures / recognizer.dart:315:9)
      10 PointerRouter._dispatch(软件包:flutter / src / gestures / pointer_router.dart:73:12)
      11 PointerRouter.route(软件包:flutter / src / gestures / pointer_router.dart:101:11)
      12 _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent(package:flutter / src / gestures / binding.dart:143:19)
      13 _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent(package:flutter / src / gestures / binding.dart:121:22)
      14 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent(包:flutter / src / gestures / binding.dart:101:7)
      15 _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue(package:flutter / src / gestures / binding.dart:64:7)
      16 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket(包:flutter / src / gestures / binding.dart:48:7)
      17 _invoke1(dart: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");
}

4 个答案:

答案 0 :(得分:2)

我也有同样的问题。最后我找到了解决方案。将您的结果转换为您的类型。

例如:

final result = await Navigator.of(context).pushNamed("/some_route") as String;

上面的代码将引发异常

但是,你可以这样做:

void uploadFile() async {
File file = _image1;//_image1 is taken from camera
final key = new DateTime.now().toString();
UploadFileResult result =
    await Amplify.Storage.uploadFile(key: key, local: file);}

上面的代码将按预期工作。

答案 1 :(得分:1)

在main.dart文件中和主函数中定义MaterialApp小部件,并在其中定义应用程序的路线(屏幕)。

main.dart:

void main() {
  runApp( 
    new MaterialApp( 
      home: new Screen1(), 
      routes: <String, WidgetBuilder> { 
        '/screen1': (BuildContext context) => new Screen1(), 
        '/screen2' : (BuildContext context) => new Screen2() 
      },
    )
  );
}

Screen1:

class Screen1 extends StatelessWidget {
    @override
     Widget build(BuildContext context) {
        ...
      }
}

Screen2:

class Screen2 extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
       ...
    }
}

要导航到屏幕,我们要做的事情:

Navigator.of(context).pushNamed('/screen2');

asyncawiat是不需要的,但是如果您要进行异步编程,例如您正在查询Firestore,并根据查询结果选择导航到新屏幕或选择显示错误。

有关更多详细信息:routing and navigation in flutter

编辑:

要在屏幕之间传递数据,请将参数传递给Screen2构造函数并使用Navigator.push()。请记住,在Navigator.pushNamed()中,您仅传递上下文和路由名称,并且不能在其中传递参数。

 Navigator.push(context, new MaterialPageRoute(
              builder: (BuildContext context) => new Screen2(new Color(0xFF66BB6A)),
            ));

Screen2:

class Screen2 extends StatelessWidget {
     Screen2(this.color);
     final Color color;
      @override
      Widget build(BuildContext context) {
           ...
        }
 }

答案 2 :(得分:1)

对我来说,错误是一个不同的错误(type 'MaterialPageRoute<dynamic>' is not a subtype of type 'Route<String>'),我通过将返回值声明为动态类型来解决了该错误:

dynamic result = await Navigator.of(context).pushNamed("/page");

虽然这失去了某种类型的安全性,但对我来说却很好。

答案 3 :(得分:0)

只需在路由器中为Page2声明工作类型MaterialPageRoute

case "/page2":
  return MaterialPageRoute<Page2>(...};