flutter使用pushNamed()从屏幕错误返回数据



我使用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.dar:1408:14(
1 NavigatorState.pushNamed(软件包包括:flutter/src/widgets/navigator.dar:1454:20(
2_MyHomePageState_推送至第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_Ink响应状态_handleTap(包:flutter/src/material/ink_well.dart:507:14(
5 _InkResponseState.build_checkUp(软件包:flutter/src/sgestures/tap.dart:242:9(
8 TapGestureRecognizer.handlePrimaryPointer_dispatch(包:flutter/src/posites/pointer_router.dart:73:12(
11 PointerRouter.route(包:flutter/src/Posites/ppointer_router.dart:101:11(
2_WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent(包:flutter/src/sgestures/binding.dart:143:19(
13_WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent(包:flutter/src/sgestures/binding.dart:121:22(
14_WidgetsFlutterBinding&BindingBase&手势绑定_handlePointerEvent(包:flutter/src/posites/binding.dart:101:7(
15_WidgetsFlutterBinding&BindingBase&手势绑定_flushPointerEventQueue(软件包:flutter/src/sgestures/binding.dart:64:7(
16_WidgetsFlutterBinding&BindingBase&手势绑定_handlePointerDataPacket(包:flutter/src/posites/bbinding.dart:48:7(
17_ivoke1(dart:ui/hooks.dart:153:13(
18_dispatchPointerDataPackset(dart:ui/hooks.dart:107:5(

但以下代码工作正常:

_pushToPage2() async {
String result = await Navigator.push(
context, MaterialPageRoute(builder: (context) => Page2()));
print("$tag $result");
}

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

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

虽然这失去了一些类型的安全性,但它对我来说很好。

我也有同样的问题。最后我找到了一个解决方案。根据你的类型来决定你的结果。

例如:

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

上面的代码将引发异常

但是,你可以这样做:

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

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

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

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

提供的答案似乎都不能解决您的问题,因为它们建议您使用dynamicvar放弃类型安全。这是一个糟糕的变通方法。

如果您打算在保持静态类型的同时使用pushNamed,这似乎是您在为要存储结果的变量提供类型String时想要的,那么只有一种可能性:类型转换。

因此,与其像这样使用pushNamed()作为一种通用方法:

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

您键入的方法结果如下:

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

不能为pushNamed()方法提供类型是Navigatorroute tables组合的已知缺陷,如本文所述。

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

main.dart:

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

屏幕1:

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

屏幕2:

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

导航到屏幕我们做:

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

CCD_ 12和CCD_;您正在查询Firestore,根据查询结果,您可以选择导航到新屏幕或选择显示错误。

有关更多详细信息:颤振中的路由和导航

编辑:

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

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

屏幕2:

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

最新更新