dart - 从抽屉路由到新主体不起作用
问题描述
我希望应用程序栏保持在应用程序的顶部,而不会在更改选项卡时更改或动画,所以我将我的代码设置为这样,这是 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 中找不到路由“选项卡/秒”的生成器。
如果有人可以帮助我克服这个问题,将不胜感激。
解决方案
这可能是错误的上下文Navigator.pushNamed(context, 'tabs/second');
将 a 传递GlobalKey
给MaterialApp.navigatorKey
https://docs.flutter.io/flutter/material/MaterialApp/navigatorKey.html并使用此键获取Navigator
调用导航方法时的上下文。
推荐阅读
- mysql - 带有 TRIGGER 语法的 mySQL 错误代码 1136
- r - 使用多根求解 R 中的积分方程组
- python - 函数返回语句中的语法错误
- stm32 - STM32F103C8T6 "0x00200000U" HAL_CAN_ERROR_PARAM
- android - 如何以自定义方式在 kotlin 中对 mutableList 的元素进行排序
- javascript - 独立运行的函数内的 Javascript 警报
- visual-studio - 除非连接了 VPN,否则不会安装具有多个源(两个 corp 和两个 Microsoft)的 nuget 包
- reactjs - 你可以在反应中做哪些类型的测试?
- javascript - 如何在反应中显示来自远程 .csv 文件的数据?
- angular - 在Angular中全局阻止ALT键