首页 > 解决方案 > 从抽屉路由到新主体不起作用

问题描述

我希望应用程序栏保持在应用程序的顶部,而不会在更改选项卡时更改或动画,所以我将我的代码设置为这样,这是 main.dart:

import 'package:flutter/material.dart';

import 'package:stewart_inc_app/tabs/first.dart';
import 'package:stewart_inc_app/tabs/second.dart';
import 'package:stewart_inc_app/tabs/third.dart';

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

class Home extends StatefulWidget {
  @override
  HomeState createState() => HomeState();
}

class HomeState extends State<Home> {
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(
        title: new Text(
          "Hello World",
        ),
      ),
      body: Navigator(
          initialRoute: 'tabs/third',
          onGenerateRoute: (RouteSettings settings) {
            WidgetBuilder builder;
            switch (settings.name) {
              case 'tabs/first':
                builder = (BuildContext _) => FirstTab();
                break;
              case 'tabs/second':
                builder = (BuildContext _) => SecondTab();
                break;
              case 'tabs/third':
                builder = (BuildContext _) => ThirdTab();
                break;
              default:
                throw Exception('Invalid route: ${settings.name}');
            }
            return MaterialPageRoute(builder: builder, settings: settings);
          }),
      drawer: Drawer(
        child: ListView(
          padding: EdgeInsets.zero,
          children: <Widget>[
            DrawerHeader(
              child: Text(
                'Select Tab',
                style: TextStyle(color: Colors.white),
              ),
              decoration: BoxDecoration(
                color: Colors.black,
              ),
            ),
            ListTile(
              title: Text('First Tab'),
              onTap: () {
                Navigator.pushNamed(context, 'tabs/first');
              },
            ),
            ListTile(
              title: Text('Second Tab'),
              onTap: () {
                Navigator.pushNamed(context, 'tabs/second');
              },
            ),
            ListTile(
              title: Text('Third Tab'),
              onTap: () {
                Navigator.pushNamed(context, 'tabs/third');
              },
            ),
          ],
        ),
      ),
    );
  }
}

这是第三个标签,third.dart:

import 'package:flutter/material.dart';

class ThirdTab extends StatelessWidget {

  static const String routeName = "/third";

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Container(
        child: new Center(
          child: new Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              new RaisedButton(
                  onPressed: () {
                    Navigator.pushNamed(context, 'tabs/second');
                  },
                  child: new Text("Second Tab"),
                ),
            ],
          ),
        ),
      ),
    );
  }
}

当我Navigator.pushNamed(context, 'tabs/second');在 third.dart 中触发时,它可以正常工作并将页面更改动画到第二个选项卡。但是,当我从 main.dart 抽屉中触发相同的代码时,出现以下错误:

颤振:处理手势时引发以下断言:颤振:在 _WidgetsAppState 中找不到路由“选项卡/秒”的生成器。

如果有人可以帮助我克服这个问题,将不胜感激。

标签: dartflutter

解决方案


这可能是错误的上下文Navigator.pushNamed(context, 'tabs/second');

将 a 传递GlobalKeyMaterialApp.navigatorKey https://docs.flutter.io/flutter/material/MaterialApp/navigatorKey.html并使用此键获取Navigator调用导航方法时的上下文。


推荐阅读