简体   繁体   English

Flutter 安全存储更改路线

[英]Flutter Secure Storage Change Route

I have successfully implemented the flutter_secure_storage in my flutter project, when the user writes his email and password, it get's stored, but here is the thing I don't understand.我已经在我的 flutter 项目中成功实现了flutter_secure_storage ,当用户编写他的 email 和密码时,它会被存储,但这是我不明白的事情。 How should I setup screen routes depending if the user has already logged in or not.我应该如何根据用户是否已经登录来设置屏幕路由。 If it is the same user, so the username and pass are stored in the secure_storage, I want him to go directly to HomeScreen() , but if there is a new user that needs to log in, so there is no data in the secure_storage, then I want him sent to LoginScreen() .如果是同一个用户,那么username和pass都存放在secure_storage中,我想让他go 直接到HomeScreen() ,但是如果有新用户需要登录,所以secure_storage中没有数据,然后我希望他发送到LoginScreen() I have done this so far:到目前为止,我已经这样做了:

import 'dart:async';
import 'package:flutter/material.dart';
import 'login_screen.dart';
import 'home_screen.dart';
import 'components/alarm_buttons.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';

class WelcomeScreen extends StatefulWidget {
  static const String id = 'welcome_screen';
  @override
  _WelcomeScreenState createState() => _WelcomeScreenState();
}

class _WelcomeScreenState extends State<WelcomeScreen> {
  void readData() async {
    final storage = FlutterSecureStorage();
    String myPassword = await storage.read(key: "p");
    String myEmail = await storage.read(key: "e");
    print(myEmail);
    print(myPassword);
  }

  @override
  void initState() {
    final storage = FlutterSecureStorage();
    Timer(
        Duration(seconds: 2),
        () => Navigator.pushNamed(
              context,
              storage == null ? LoginScreen.id : HomePage.id,
            ));
    readData();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: Padding(
        padding: EdgeInsets.symmetric(horizontal: 24.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            AlarmButtons(
              buttonColour: Colors.grey,
              buttonText: 'Log In',
              buttonTextColour: Colors.white,
              onButtonPress: () {
                Navigator.pushNamed(context, LoginScreen.id);
              },
            ),
            AlarmButtons(
              buttonColour: Colors.white,
              buttonText: 'Sign up',
              buttonTextColour: Colors.grey,
              onButtonPress: () {
                Navigator.pushNamed(context, SignUpScreen.id);
              },
            ),
          ],
        ),
      ),
    );
  }
}

Now the problem starts when I want to return to the Welcome Screen (the starting page of my app shown above), naturally it triggers the initState again and I get back to the HomePage() again.现在问题开始了,当我想返回欢迎屏幕(上面显示我的应用程序的起始页面)时,它自然会再次触发 initState,然后我再次返回HomePage() How can I dispose of that, only triggering that initState when the app starts, so after automatic login I can return to the Welcome Screen without triggering it?我该如何处理它,仅在应用程序启动时触发该 initState ,因此在自动登录后我可以返回欢迎屏幕而不触发它?

Thanks in advance!提前致谢!

You should initial start something like a SplashScreen (or WelcomeScreen in your case).您应该首先启动类似 SplashScreen(或在您的情况下为 WelcomeScreen)的东西。 There you can decide to which screen you want to navigate based on the saved data.在那里,您可以根据保存的数据决定要导航到哪个屏幕。 Example:例子:

class SplashScreen extends StatefulWidget {
  const SplashScreen({Key key}) : super(key: key);

  @override
  _SplashScreenState createState() => _SplashScreenState();
}

class _SplashScreenState extends State<SplashScreen> {
  @override
  void initState() {
    _startApp();
    super.initState();
  }

  Future<void> _startApp() async {
    final storage = FlutterSecureStorage();
    String myEmail = await storage.read(key: "e");
    if (myEmail == null) {
      // TODO Navigate to Login Screen
    } else {
      // TODO Navigate to Home Screen
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text("Splashscreen"),
      ),
    );
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM