Flutter 重新登录它不会定向到预期的主页
Flutter re-login it does not directs to the intended home page
Flutter Logout 指向登录页面,但在重新登录后它不会重定向到预期的主页。
我已经使用下面的导航进行登录
Navigator.of(context).pushReplacement(PageRouteBuilder(pageBuilder: (_, __, ___) => Home()));
我的应用程序由三个底部导航栏组成 bar.Home 页面在第二个导航栏中。我必须从第三个导航栏注销。
我已经使用下面的代码注销
Navigator.pushNamedAndRemoveUntil(context, '/Login', (_) => false);
我也试过密码
Navigator.popAndPushNamed(context, "/Login");
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (BuildContext context) => Login(),), (Route route) => false);
请帮我找到解决办法。
尝试使用共享首选项存储为登录密钥并检查是否为真然后转到主屏幕或重定向到登录屏幕。
首先在你的 pubspec.yaml
中添加共享偏好依赖
dependencies:
flutter:
sdk: flutter
shared_preferences: ^0.5.6+2
SplashScreen.dart
这是我们检查 isLogin 是否为真 的第一个屏幕,然后转到 HomeScreen 或 else 重定向到 LoginScreen
_autoLogin() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
if (!prefs.containsKey('isLogin')) {
prefs.setBool('isLogin', false);
}
if (prefs.getBool('isLogin')) {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => HomeScreen(),
));
} else {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => LoginScreen(),
));;
}
}
LoginScreen.dart
_setIsLogin() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool('isLogin', true);
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => HomeScreen(),
));
}
MaterialButton(
minWidth: MediaQuery.of(context).size.width,
padding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
onPressed: () {
_setIsLogin();
},
child: Text("LOGIN",
textAlign: TextAlign.center,
style: style.copyWith(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 18.0)),
),
HomeScreen.dart
当点击注销
时,将isLogin设置为false
_logout() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool('isLogin', false);
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => LoginScreen(),
));
}
希望对您有所帮助!
这是我的启动画面
class SplashState extends State<SplashScreen>{
bool isLogged = false;
startTime(){
return new Timer(Duration(milliseconds: 3000), navigateUser);
}
@override
void initState() {
super.initState();
getStoredValue();
}
void getStoredValue() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
if (!prefs.containsKey('isLoggin')) {
prefs.setBool('isLoggin', false);
print("login set to False");
}
isLogged = prefs.getBool('isLoggin');
print("Status in splash -----------$isLogged");
startTime();
}
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIOverlays([]);
return Container(
height: double.infinity,
width: double.infinity,
decoration: BoxDecoration(
gradient:LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: <Color>[
colorStyle.splashPink,
colorStyle.splashOrange,
],
)
),
child: Center(
child: Image.asset("assets/images/splash_logo.png", height: 85.0),
),
);
}
void navigateUser() {
if (isLogged == true) {
Navigator.of(context).pushReplacement(
PageRouteBuilder(pageBuilder: (_, __, ___) => Home()));
}
else {
Navigator.of(context).pushReplacement(
PageRouteBuilder(pageBuilder: (_, __, ___) => Login()));
}
}
}
注销
void logoutUser()async{
LogoutUser objLog = await createPost(logoutUrl,body);
if(objLog.statusCode == 10000){
print(("response is $resp"));
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool('isLoggin', false);
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => Login()));
}
else showToast(objLog.message, duration: Toast.LENGTH_LONG);
}
Flutter Logout 指向登录页面,但在重新登录后它不会重定向到预期的主页。
我已经使用下面的导航进行登录
Navigator.of(context).pushReplacement(PageRouteBuilder(pageBuilder: (_, __, ___) => Home()));
我的应用程序由三个底部导航栏组成 bar.Home 页面在第二个导航栏中。我必须从第三个导航栏注销。
我已经使用下面的代码注销
Navigator.pushNamedAndRemoveUntil(context, '/Login', (_) => false);
我也试过密码
Navigator.popAndPushNamed(context, "/Login");
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (BuildContext context) => Login(),), (Route route) => false);
请帮我找到解决办法。
尝试使用共享首选项存储为登录密钥并检查是否为真然后转到主屏幕或重定向到登录屏幕。
首先在你的 pubspec.yaml
dependencies:
flutter:
sdk: flutter
shared_preferences: ^0.5.6+2
SplashScreen.dart
这是我们检查 isLogin 是否为真 的第一个屏幕,然后转到 HomeScreen 或 else 重定向到 LoginScreen
_autoLogin() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
if (!prefs.containsKey('isLogin')) {
prefs.setBool('isLogin', false);
}
if (prefs.getBool('isLogin')) {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => HomeScreen(),
));
} else {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => LoginScreen(),
));;
}
}
LoginScreen.dart
_setIsLogin() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool('isLogin', true);
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => HomeScreen(),
));
}
MaterialButton(
minWidth: MediaQuery.of(context).size.width,
padding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
onPressed: () {
_setIsLogin();
},
child: Text("LOGIN",
textAlign: TextAlign.center,
style: style.copyWith(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 18.0)),
),
HomeScreen.dart
当点击注销
时,将isLogin设置为false_logout() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool('isLogin', false);
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => LoginScreen(),
));
}
希望对您有所帮助!
这是我的启动画面
class SplashState extends State<SplashScreen>{
bool isLogged = false;
startTime(){
return new Timer(Duration(milliseconds: 3000), navigateUser);
}
@override
void initState() {
super.initState();
getStoredValue();
}
void getStoredValue() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
if (!prefs.containsKey('isLoggin')) {
prefs.setBool('isLoggin', false);
print("login set to False");
}
isLogged = prefs.getBool('isLoggin');
print("Status in splash -----------$isLogged");
startTime();
}
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIOverlays([]);
return Container(
height: double.infinity,
width: double.infinity,
decoration: BoxDecoration(
gradient:LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: <Color>[
colorStyle.splashPink,
colorStyle.splashOrange,
],
)
),
child: Center(
child: Image.asset("assets/images/splash_logo.png", height: 85.0),
),
);
}
void navigateUser() {
if (isLogged == true) {
Navigator.of(context).pushReplacement(
PageRouteBuilder(pageBuilder: (_, __, ___) => Home()));
}
else {
Navigator.of(context).pushReplacement(
PageRouteBuilder(pageBuilder: (_, __, ___) => Login()));
}
}
}
注销
void logoutUser()async{
LogoutUser objLog = await createPost(logoutUrl,body);
if(objLog.statusCode == 10000){
print(("response is $resp"));
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool('isLoggin', false);
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => Login()));
}
else showToast(objLog.message, duration: Toast.LENGTH_LONG);
}