如何使用共享首选项使用户登录保持混乱

时间:2020-04-14 14:04:41

标签: flutter navigation

这个问题已经在堆栈溢出中问了,但是我的代码仍然有问题..现在,我有启动屏幕,登录名和主屏幕...用户登录后,它们将导航到主屏幕,并且无论何时单击注销之前关闭应用程序,我想将它们重定向到启动画面,然后重定向到主屏幕,有没有办法做到这一点...我尝试使用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),
      ),
    );
  }
}

1 个答案:

答案 0 :(得分:1)

我添加了此代码,然后您的示例正常运行

onWillPop: () => _onWillPop(),