来自 MaterialApp 构建器的导航器

Yoo*_*omi 7 dart flutter

我正在尝试将我的整个应用程序嵌入到 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 !'),
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

但是在按下“单击我”按钮时,会出现一个错误,指出上下文没有导航器

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

但实际上,该按钮是一个页脚,可以单击以从每个页面更改页面。

我想知道如何从自定义构建器访问导航器,如果我只是朝着错误的方式在我的应用程序的每个页面(页脚 + 页眉)中使用相同的模式

Hem*_*Raj 14

您无法从内部访问Navigator,因为由此返回的任何小部件都将成为导航器的父级。contextbuilderbuilder

那么,我该怎么办?我可以在这里访问导航器,如何访问?

是的!您可以创建一个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 !'),
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

希望有帮助!

  • 知道如何通过树提供该密钥以便我们可以使用“showDialog()”吗? (2认同)

Rod*_*tos -4

将此上下文变量重命名为其他名称

builder: (context, child)
Run Code Online (Sandbox Code Playgroud)

您在此处使用的上下文出现名称冲突:

onPressed: () => Navigator.of(context).pushNamed('/app'),
Run Code Online (Sandbox Code Playgroud)