我使用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");
}
答案 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');
async
和awiat
是不需要的,但是如果您要进行异步编程,例如您正在查询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>(...};