我有一辆StatefulWidget,我想在指定的路由上使用.我必须传递一些论点,我正在按照https://flutter.dev/docs/cookbook/navigation/navigate-with-arguments节中建议的那样做.

Navigator.pushNamed(
      context,
      routeName,
      arguments: <args>,
    );

现在,我需要访问州的initState方法中的这些参数,因为订阅一些外部事件需要这些参数.如果我将args = ModalRoute.of(context).settings.arguments;调用放在initState中,我会得到一个运行时异常.

20:49:44.129 4 info flutter.tools I/flutter ( 2680): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
20:49:44.129 5 info flutter.tools I/flutter ( 2680): The following assertion was thrown building Builder:
20:49:44.129 6 info flutter.tools I/flutter ( 2680): inheritFromWidgetOfExactType(_ModalScopeStatus) or inheritFromElement() was called before
20:49:44.130 7 info flutter.tools I/flutter ( 2680): _CourseCohortScreenState.initState() completed.
20:49:44.130 8 info flutter.tools I/flutter ( 2680): When an inherited widget changes, for example if the value of Theme.of() changes, its dependent
20:49:44.131 9 info flutter.tools I/flutter ( 2680): widgets are rebuilt. If the dependent widget's reference to the inherited widget is in a constructor
20:49:44.131 10 info flutter.tools I/flutter ( 2680): or an initState() method, then the rebuilt dependent widget will not reflect the changes in the
20:49:44.131 11 info flutter.tools I/flutter ( 2680): inherited widget.
20:49:44.138 12 info flutter.tools I/flutter ( 2680): Typically references to inherited widgets should occur in widget build() methods. Alternatively,
20:49:44.138 13 info flutter.tools I/flutter ( 2680): initialization based on inherited widgets can be placed in the didChangeDependencies method, which
20:49:44.138 14 info flutter.tools I/flutter ( 2680): is called after initState and whenever the dependencies change thereafter.
20:49:44.138 15 info flutter.tools I/flutter ( 2680): 
20:49:44.138 16 info flutter.tools I/flutter ( 2680): When the exception was thrown, this was the stack:
20:49:44.147 17 info flutter.tools I/flutter ( 2680): #0      StatefulElement.inheritFromElement.<anonymous closure> (package:flutter/src/widgets/framework.dart:3936:9)
20:49:44.147 18 info flutter.tools I/flutter ( 2680): #1      StatefulElement.inheritFromElement (package:flutter/src/widgets/framework.dart:3969:6)
20:49:44.147 19 info flutter.tools I/flutter ( 2680): #2      Element.inheritFromWidgetOfExactType (package:flutter/src/widgets/framework.dart:3285:14)
20:49:44.147 20 info flutter.tools I/flutter ( 2680): #3      ModalRoute.of (package:flutter/src/widgets/routes.dart:698:46)
20:49:44.147 21 info flutter.tools I/flutter ( 2680): #4      _CourseCohortScreenState.initState.<anonymous closure> (package:esk2/cohort_screen.dart:57:23)

我不想把这个逻辑放在build方法中,因为build可以被多次调用,而初始化只需要进行一次.我可以将整个逻辑放在带有布尔isInitialized标志的挡路中,但这似乎不是正确的方法. 到目前为止,是否不支持此要求/ case ?

推荐答案

使用MaterialApp.onGenerateRoute属性,如下所示:

onGenerateRoute: (RouteSettings settings) {
  print('build route for ${settings.name}');
  var routes = <String, WidgetBuilder>{
    "hello": (ctx) => Hello(settings.arguments),
    "other": (ctx) => SomeWidget(),
  };
  WidgetBuilder builder = routes[settings.name];
  return MaterialPageRoute(builder: (ctx) => builder(ctx));
},

现在您可以简单地使用NavigatorState.pushNamed:

Navigator.of(context).pushNamed("hello", arguments: "world");

下面是一些测试Hello小部件:

class Hello extends StatelessWidget {
  final String greet;

  Hello(this.greet);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: Text(
          'hello $greet',
          textScaleFactor: 5.0,
        ),
      ),
    );
  }
}

Flutter相关问答推荐

如何增加容器高度?

如何正确处理Flutter 翼中使用火基时发生的碰撞?

如何使文本表格域在抖动中变圆?

如何在Ffltter 3.16中设置标准的提升按钮主题?

Flutter 文件拾取器Android SingleInstance模式它返回的文件路径为空

如何管理枚举类型的阻塞事件?

上传的图像不能在FireBase中预览.S档案类型为空白,摆动

DART:如何判断有时可以为空的泛型类型?

Flutter Web Dio XMLHttpRequest 上传大文件时出错

在flutter中从图库或相机中 Select 图像的方法

如何使Flutter 屏幕无法关闭?

Flutter:如何在 bottomsheet 中创建一个日期 Select 器,如下图所示

应用程序包含嵌入式私钥或密钥库文件

如何在两个不同的路由(屏幕)之间正确设置 BlocProvider?

如何在图像上点或(图像的一部分)在 flutter 中点击?

如何使用 Row 和 Column 制作 L 形布局?

Flutter 中父容器顶部的 Gridview 间距额外区域

构建失败 - 无法解析 io.grpc:grpc-core:[1.28.0]. (是的,我已经升级到 mavenCentral())

try 为两个下拉值添加共享首选项,但在 Flutter 上显示错误断言失败:?

Flutter Firebase:如何判断返回值是否是特定对象