在下面的示例中,当我推送new MaterialPageRoute时,它是在与Flatter小部件树中的Home小部件相同的级别上创建的.我希望它是widget Home的子元素,所以Home将是child widget的父母.

以下是完整的代码:

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: Home(),
  ));
}

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          Center(
            child: Text("This is home"),
          ),
          RaisedButton(
            child: Text("Open child view"),
            onPressed: () {
              Navigator.of(context)
                  .push(MaterialPageRoute(builder: (context) => Child()));
            },
          )
        ],
      ),
    );
  }
}

class Child extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Container(
      child: Text("Child view"),
    ));
  }
}

下面是小部件树的样子

enter image description here

我希望实现这一点,因为我希望初始化ScopedModel in Home小部件,并使其在我创建的每个新的MaterialPageRoute中都可用.

推荐答案

我使用嵌套导航器解决了我的问题.

下面是一个例子:

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: Home(),
  ));
}

var homeNavigatorKey = GlobalKey<NavigatorState>();

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Navigator(
        key: homeNavigatorKey,
        onGenerateRoute: (settings) {
          /*dirty code for illustration purposes only*/
          if (settings.name == '/child') {
            return MaterialPageRoute(builder: (context) => Child());
          } else {
            return MaterialPageRoute(
                builder: (context) => Column(
                      children: <Widget>[
                        Center(
                          child: Text("This is home"),
                        ),
                        RaisedButton(
                          child: Text("Open child view"),
                          onPressed: () {
                            homeNavigatorKey.currentState.pushNamed('/child');
                          },
                        )
                      ],
                    ));
          }
        },
      ),
    );
  }
}

class Child extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Container(
      child: RaisedButton(
        onPressed: () => Navigator.of(context).pop(),
        child: Text("Back to home"),
      ),
    ));
  }
}

这棵树看起来像这样

enter image description here

并允许将数据从家中传递给每个子元素.

如果你有更简单的解决方案,请随意 comments 或发布答案.

Dart相关问答推荐

基本数学函数的DART源代码

Dart 扩展: don't access members with "this" unless avoiding shadowing

Dart,后面带感叹号的标识符

GPS是否激活

Dart 1.8 中的异步/等待功能

SliverList / SliverChildBuilderDelegate 提供初始索引或允许负索引

Flutter:将照片或图像显示为模态弹出窗口

Flutter 从asset文件夹中读取所有文件

为什么这个文件会自动创建自己 generate_plugin_registrant.dart

如何从JSON对象获取格式化/缩进的JSON字符串?

使用元组解包样式交换两个变量的值

如何在Dart中switch 枚举?

如何在 Dart 中监听自定义事件?

Visual Studio 的 Dart 插件

如何重新引发异常并保留堆栈跟踪?

Dart: 必须取消 Stream 订阅并关闭 StreamSinks 吗?

如何在 Dart 中读取控制台输入/标准输入?

GWT 与 Dart - 主要区别是什么? Dart 是 GWT 的潜在替代品吗?

dart中是否可以有一个私有构造函数?

extends与 implements与 with