这个问题已经在堆栈溢出中问了,但是我的代码仍然有问题..现在,我有启动屏幕,登录名和主屏幕...用户登录后,它们将导航到主屏幕,并且无论何时单击注销之前关闭应用程序,我想将它们重定向到启动画面,然后重定向到主屏幕,有没有办法做到这一点...我尝试使用SharedPreferences保存并获取密钥,但是在单击注销之前(只需单击返回按钮),我的应用程序总是重定向到我的登录屏幕而不是主屏幕,我想念一些东西吗?这是我的Main.dart代码
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: SplashScreen(),
);
}
}
这是我的启动画面
class SplashScreenState extends State<SplashScreen> {
Future check() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String _key = (prefs.getString('key') ?? false);
if (_key==null) {
Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (context) => new LoginScreen()));
} else {
Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (context) => new BottomTab()));
}
}
@override
void initState() {
super.initState();
new Timer(new Duration(seconds: 3), () {
check();
});
}
@override
Widget build(BuildContext context) {...}
在我的登录屏幕中,我添加了以下代码以保存我的密钥,然后将其导航到主屏幕(BottomTab)
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('key', myKey);
Navigator.pushReplacement(context,
MaterialPageRoute(builder: (BuildContext ctx) => BottomTab()));
这是我的主屏幕,其中包含“底部”标签
class _BottomTab extends State<BottomTab> {
Future<bool> _back() {
return showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
content: Text('exit?'),
actions: <Widget>[
FlatButton(
child: Text('ok'),
onPressed: () {
Navigator.of(context).pop(true);
},
),
FlatButton(
child: Text('no'),
onPressed: () {
Navigator.of(context).pop(false);
},
),
],
);
});
}
int _selectedIndex = 0;
_onTap(int index) {
setState(() => _myindex = index);
}
final List<Widget> pages = [
HomeScreen(),
ProfileScreen(),
];
final PageStorageBucket bucket = PageStorageBucket();
Widget _myNavigation(int selectedIndex) => BottomNavigationBar(
onTap: _onTap,
currentIndex: myindex,
type: BottomNavigationBarType.fixed,
items: const <MyTab>[
MyTab(icon: Icon(Icons.home), title: Text('Home')),
MyTab(icon: Icon(Icons.person), title: Text('Profile')),
],
);
@override
Widget build(BuildContext context) {
return FutureProvider<String>(
create: (context) async {
final prefs = await SharedPreferences.getInstance();
return prefs.getString("username");
},
child: Scaffold(
key: scaffoldKey,
body: WillPopScope(
onWillPop: _back,
child: PageStorage(
child: pages[_selectedIndex],
bucket: bucket,
),
),
bottomNavigationBar: _bottomNavigationBar(_selectedIndex),
),
);
}
}
答案 0 :(得分:1)
我添加了此代码,然后您的示例正常运行
onWillPop: () => _onWillPop(),