如何禁用用户在成功登录后回到扑动



我有这个登录功能,它工作得很好,但问题是用户可以按后退键返回登录屏幕,我想禁用它。

void _login() async {
setState(() {
_isLoading = true;
});
var data = {'email': email, 'password': password};
print("Data =" + data.toString());
var res = await Network().authData(data, '/login');
var body = json.decode(res.body);
print(body);
if (body['success']) {
SharedPreferences localStorage = await SharedPreferences.getInstance();
localStorage.setString('access_token', json.encode(body['access_token']));
localStorage.setString('user', json.encode(body['user']));
if (body['user']['verified'] == 1) {
// OPEN THE HOME PAGE AND BLOCK THE BACK ACTION 
Navigator.push(
context,
MaterialPageRoute(builder: (context) => HomeScreen()),
);
} else {
showAnimatedDialog(
context: context,
barrierDismissible: true,
builder: (BuildContext context) {
return AlertDialog(
backgroundColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
content: Container(
width: 100,
height: 50,
child:
Center(child: Text("Your account isn't verified yet!")),
));
},
animationType: DialogTransitionType.fadeScale,
curve: Curves.fastOutSlowIn,
duration: Duration(seconds: 1),
);
}
} else {
_showMsg(body['message']);
}
setState(() {
_isLoading = false;
});
}

另外,有没有一种方法也保持他登录后,即使关闭应用程序一旦登录完成?(直到用户按下退出按钮)。

first:让我们了解如何在Flutter框架中组织屏幕:

Flutter中的屏幕以堆栈方式组织,因此如果您在屏幕a你按了屏幕B,则从Screen B你按了屏幕C,你的堆栈看起来像这样:

按下屏幕B后:

屏幕
  1. 屏幕B(当前屏幕)

按下屏幕C:

屏幕
  1. 屏幕B
  2. 屏幕C(当前屏幕)

我们输入屏幕B您的登录屏幕,而你想阻止用户返回,那么你就不必只使用Push您应该将替换为主屏幕.

其次:现在,在理解了流程之后,让我们来讨论一下代码:

在您的场景中,您必须使用Navigator.pushReplacement()来替换上面提到的堆栈中的屏幕,而不是使用Navigator.push()

反弹:如果您处于需要从堆栈中删除所有屏幕并仅保留将被推入的屏幕的场景中,例如,如果您有一个多步骤注册流程,并且在成功注册后,您希望从堆栈中弹出进程的所有屏幕并推入主屏幕,那么您可以使用以下技巧:

Navigator.popUntil((route) => route.isFirst);//在推入屏幕之前执行它,以便在堆栈中只保留一条路由(屏幕)。Navigator.pushReplacement();//现在你正在用新的屏幕替换堆栈中唯一的屏幕,所以堆栈将只包含你想要的屏幕。

我找到了一种方法,我不知道这是不是一种好方法,但这确实起到了作用

像这样用WillPopScope包裹scaffold:

WillPopScope(
onWillPop: () async => false,
)

I got it from here

首先需要检查用户是否通过身份验证....

你必须在material app的home :参数中检查这个条件。

if (snapShot.connectionState == ConnectionState.waiting) {
return const SplashScreen(); // If it's in waiting state it will show splash screen
}
if (snapShot.hasData) {
return const homeScreen(); // If user is authenticated it will show home screen
}
return const LoginScreen(); // If user is not authenticated then it will show login screen

在这里,snapShot是关于用户数据的。提前谢谢。

要阻止用户移动回上一个屏幕,请尝试Navigator。pushReplacement代替Navigator.push.

最新更新