【发布时间】:2022-01-18 19:29:44
【问题描述】:
我正在尝试让导航器来处理我的图标。我将所有图标放在一个列中,该列在我的所有屏幕上都存在,当我单击菜单左侧的图标时,我希望能够转到不同的屏幕。右下角的图标已被禁用,我只是用它们来指代第一页和第二页。
我已经在 MyApp 小部件中设置了一个导航器,该导航器可以路由到名为 firstpage 和 secondpage 的几个测试页面,但当我单击图标并尝试路由到另一个页面时,我会收到以下错误:
The following assertion was thrown while handling a gesture:
Navigator operation requested with a context that does not include a Navigator.
我假设我没有正确使用导航器,但我不确定我需要做什么。
main.dart
import 'package:flutter/material.dart';
import 'package:practice3/secondpage.dart';
import 'firstpage.dart';
import 'package:flutter/services.dart';
import 'persistentmenu.dart';
import 'persistentrow.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setPreferredOrientations(
[DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight],
).then((_) {
runApp(const MyApp());
});
}
class BaseWidget extends StatelessWidget {
final Widget child;
const BaseWidget({required this.child});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: [
Container(child: child),
PersistentRow(),
PersistentMenu(),
],
)
);
}
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
builder: (context, child) => BaseWidget(child: child!),
initialRoute: '/',
routes: {
'/': (context) => FirstPage(),
'/second': (context) => SecondPage(),
},
);
}
}
persistentmenu.dart
import 'package:flutter/material.dart';
import 'firstpage.dart';
import 'secondpage.dart';
class PersistentMenu extends StatelessWidget {
@override
Widget build(BuildContext context) {
return SafeArea(
child: Align(
alignment: Alignment.bottomLeft,
child: Container(
width: 80,
height: 800,
//margin: EdgeInsets.only(right: 25),
color: Color.fromRGBO(2, 58, 107, 1),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
IconButton(
padding: EdgeInsets.all(0.0),
icon: Image.asset('assets/icons/Back.png'),
onPressed: () {
Navigator.pushNamed(context, '/'); // Route to firstpage.dart
},
),
IconButton(
padding: EdgeInsets.all(0.0),
icon: Image.asset('assets/icons/tip_load.png'),
onPressed: () {},
),
IconButton(
padding: EdgeInsets.all(0.0),
icon: Image.asset('assets/icons/tip_eject.png'),
onPressed: () {},
),
IconButton(
padding: EdgeInsets.all(0.0),
icon: Image.asset('assets/icons/Light.png'),
onPressed: () {},
),
IconButton(
padding: EdgeInsets.all(0.0),
icon: Image.asset('assets/icons/Utility.png'),
onPressed: () {
Navigator.pushNamed(context, '/second'); // Route to secondpage.dart
},
),
IconButton(
padding: EdgeInsets.all(0.0),
icon: Image.asset('assets/icons/Help.png'),
onPressed: () {},
),
IconButton(
padding: EdgeInsets.all(0.0),
icon: Image.asset('assets/icons/User.png'),
onPressed: () {},
),
IconButton(
padding: EdgeInsets.all(0.0),
icon: Image.asset('assets/icons/Power.png'),
onPressed: () {},
),
],
),
),
),
);
}
}
secondpage.dart
import 'package:flutter/material.dart';
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Align(
alignment: Alignment.bottomRight,
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
ElevatedButton.icon(
onPressed: () {
//Navigator.pushNamed(context, '/');
},
icon: Icon(Icons.arrow_back_outlined),
label: Text('Back to first Page'),
),
],
),
),
);
}
}
【问题讨论】:
-
尝试从 main.dart 文件中删除构建器
-
我也试过这个,它似乎并没有让错误消失,奇怪的是导航器在我有提升按钮的 secondpage.dart 中工作得很好。虽然这仅用于测试,但我希望左侧菜单的按钮具有相同的功能,但是当我将导航器放在按下图标时,它们不起作用。
标签: flutter android-studio dart