flutter - 来自 MaterialApp 构建器的导航器
问题描述
我正在尝试将我的整个应用程序嵌入到 AppBar 和页脚中。所以我尝试为我的 MaterialApp 提供一个自定义生成器,看起来像这样(为了清楚起见,我用按钮替换了页脚和应用栏)
import 'package:epicture/scenes/Landing.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
initialRoute: '/',
builder: (context, child) => Container(
child: FlatButton(
child: Text('Click me'),
onPressed: () => Navigator.of(context).pushNamed('/app'),
)),
// In my current code
builder: (context, child) => Embedder(child),
routes: <String, WidgetBuilder>{
'/': (context) => Landing(),
'/app': (context) => Text('My App !'),
},
);
}
}
但是在按下“点击我”按钮时,会出现一个错误,指出上下文没有导航器
the context used to push or pop routes from the Navigator must be that of a widget that is a descendant of a Navigator widget
但实际上,该按钮是一个页脚,可以单击以从每个页面更改页面。
我想知道如何从自定义构建器访问导航器,如果我只是朝着错误的方向前进,在我的应用程序的每个页面中都有相同的模式(页脚 + 页眉)
解决方案
您无法从内部访问Navigator
,因为由此返回的任何小部件都将成为导航器的父级。context
builder
builder
那么,我该怎么办?我可以在这里访问导航器,如何?
是的!您可以创建一个GlobalKey
并将其传递给您的MaterialApp
. 然后使用该密钥访问Navigator
您的builder
.
例子:
import 'package:epicture/scenes/Landing.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
final GlobalKey<NavigatorState> _navigator = GlobalKey<NavigatorState>();
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
initialRoute: '/',
navigatorKey: _navigator,
builder: (context, child) {
return Container(
child: FlatButton(
child: Text('Click me'),
onPressed: () => _navigator.currentState.pushNamed('/app'),
),
);
},
routes: <String, WidgetBuilder>{
'/': (context) => Landing(),
'/app': (context) => Text('My App !'),
},
);
}
}
希望有帮助!
推荐阅读
- python - 在多个文本文件中搜索字符串
- javascript - JavaScript:需要一个标识符,而是看到“myFunction”
- php - 为什么这个带有 HTML(下拉)选择项的 PHP 和 SQL 代码什么都不做?
- maven - 有没有办法自动增加通过詹金斯构建工作的版本?
- azure-devops - 如何为 Azure DevOps 中的计划构建自定义提交名称
- python - Groupby 同时按两个不同的选项
- ansible - 如何以用户身份运行 list_vms 检查(似乎以 root 身份运行)?
- sql - 使用两列的 SQL 日期范围
- node.js - NodeJS:在异步函数之外获取值
- java - 多个不区分大小写的字符串替换