我昨天发现了Flutter并尝试了一下,但是我有一个问题。我按照教程实现了抽屉导航(这个),抽屉打开得很好,按钮也能正常改变,但是调用Navigator.pop(context)或Navigator.of(context).pop()时,两者的行为都像这样:
在点击“Characters”之前:
在点击“Characters”之后:
我在网上搜索了一下,但是没有找到类似的问题:/ 这是我的代码:
main.dart:
在点击“Characters”之前:
![Before tap](https://istack.dev59.com/CzQ8D.webp)
![After tap](https://istack.dev59.com/gpL2D.webp)
main.dart:
import 'package:flutter/material.dart';
import 'package:dnd/home.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'DnD',
home: new Home()
);
}
}
home.dart:
import 'package:flutter/material.dart';
import 'package:dnd/home_fragment.dart';
import 'package:dnd/char_fragment.dart';
class Home extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new HomeState();
}
}
class HomeState extends State<Home> {
int selectedDrawerIndex = 0;
getDrawerItemWidget(int pos) {
switch(pos) {
case 0:
return new HomeFragment();
case 1:
return new CharFragment();
default:
return new Text('ERROR');
}
}
onSelectItem(int index) {
setState(() => selectedDrawerIndex = index);
print(Navigator.of(context).pop());
}
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'DnD',
home: new Scaffold(
appBar: new AppBar(
title: new Text(
'DnD'
)
),
drawer: new Drawer(
child: new Column(
children: <Widget>[
new UserAccountsDrawerHeader(
accountName: new Text(
'bla'
),
accountEmail: null,
),
new Column(
children: <Widget>[
new ListTile(
title: new Text(
'Home'
),
leading: new Icon(
Icons.home
),
selected: 0 == selectedDrawerIndex,
onTap: () => onSelectItem(0),
),
new ListTile(
title: new Text(
'Characters'
),
leading: new Icon(
Icons.person
),
selected: 1 == selectedDrawerIndex,
onTap: () => onSelectItem(1),
)
],
),
],
),
),
body: getDrawerItemWidget(selectedDrawerIndex)
)
);
}
}
home_fragment.dart:
import 'package:flutter/material.dart';
class HomeFragment extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Center(
child: new Text(
'moin'
)
);
}
}
char_fragment.dart:
import 'package:flutter/material.dart';
class CharFragment extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new CharState();
}
}
class CharState extends State<CharFragment> {
characterNew() async {
await showDialog<bool>(
context: context,
child: new AlertDialog(
title: new Text('Create new Character?'),
actions: <Widget>[
new FlatButton(
child: new Text('Yes'),
onPressed: () => Navigator.of(context).pop(true)
),
new FlatButton(
child: new Text('No'),
onPressed: () => Navigator.of(context).pop(false)
)
],
)
);
}
@override
Widget build(BuildContext context) {
return new Center(
child: new GridView.count(
crossAxisCount: 3,
crossAxisSpacing: 10.0,
mainAxisSpacing: 10.0,
children: <Widget>[
new RaisedButton.icon(
onPressed: characterNew,
icon: new Icon(Icons.add, size: 80.0,),
label: new Text('')
)
],
)
);
}
}
setState
替换body
内容的部分不应该允许您在“弹出”时反转state
。 - Shady AzizapushReplacement
,那么在导航器堆栈中就没有任何内容可以进行pop
操作。 - onmyway133