Flutter 安全存储更改路由
Flutter Secure Storage Change Route
我已经在我的 flutter 项目中成功实现了 flutter_secure_storage,当用户写下他的电子邮件和密码时,它就会被存储,但这是我不明白的地方。我应该如何设置屏幕路由取决于用户是否已经登录。如果是同一个用户,那么username和pass存放在secure_storage,我想让他直接去HomeScreen()
,但是如果有新用户需要登录,那么就有就是secure_storage里面没有数据,那我要他发到LoginScreen()
。到目前为止我已经这样做了:
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);
},
),
],
),
),
);
}
}
现在,当我想 return 进入欢迎屏幕(上面显示的我的应用程序的起始页面)时,问题就开始了,自然会再次触发 initState,然后我回到 HomePage()
再次。我该如何处理它,仅在应用程序启动时触发该 initState,因此在自动登录后我可以 return 进入欢迎屏幕而不触发它?
提前致谢!
您应该首先启动 SplashScreen(或您的情况下为 WelcomeScreen)之类的东西。在那里,您可以根据保存的数据决定要导航到哪个屏幕。示例:
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"),
),
);
}
}
我已经在我的 flutter 项目中成功实现了 flutter_secure_storage,当用户写下他的电子邮件和密码时,它就会被存储,但这是我不明白的地方。我应该如何设置屏幕路由取决于用户是否已经登录。如果是同一个用户,那么username和pass存放在secure_storage,我想让他直接去HomeScreen()
,但是如果有新用户需要登录,那么就有就是secure_storage里面没有数据,那我要他发到LoginScreen()
。到目前为止我已经这样做了:
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);
},
),
],
),
),
);
}
}
现在,当我想 return 进入欢迎屏幕(上面显示的我的应用程序的起始页面)时,问题就开始了,自然会再次触发 initState,然后我回到 HomePage()
再次。我该如何处理它,仅在应用程序启动时触发该 initState,因此在自动登录后我可以 return 进入欢迎屏幕而不触发它?
提前致谢!
您应该首先启动 SplashScreen(或您的情况下为 WelcomeScreen)之类的东西。在那里,您可以根据保存的数据决定要导航到哪个屏幕。示例:
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"),
),
);
}
}