如何在flutter中登录后禁用用户返回

Posted

技术标签:

【中文标题】如何在flutter中登录后禁用用户返回【英文标题】:how to disable user to go back after login in flutter 【发布时间】:2020-12-13 23:48:28 【问题描述】:

在这个应用程序中,当用户点击登录页面导航到主页但当用户在主屏幕上按下返回按钮时页面导航到登录,所以这不是正确的流程

我尝试使用 navigator.pushReplacement,但是当用户在主屏幕上按下后退按钮时,应用程序关闭并转到后台,当用户从后台打开该应用程序然后显示主屏幕时,它显示登录屏幕,所以请提供建议,

这是我的代码 登录界面

Future<void> login(
      String emailId, String password, String accessToken) async 
    final dio = Dio(); // Provide a dio instance
    String token = AppStrings.keyBearer + accessToken;
    var customHeaders = 
      AppStrings.authorization: token,
      AppStrings.keyContentType: AppStrings.valueContentType
    ;

    dio.options.headers.addAll(customHeaders);
    final client = RestClient(dio);
    await client
        .loginUser(LoginUser(
            deviceToken: AppStrings.valueDeviceToken,
            lastLoginPlatform: AppStrings.valuePlatform))
        .then((res) 
          if(res.interests.isEmpty)
            AppHelper.showToastMessage(
                AppStrings.message_logged_in_successfully);
            Navigator.of(context, rootNavigator: true).pop();
            Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (context) => InterestsPage(
                      userAccesstoken: accessToken,
                    )));
          
          else
            AppHelper.showToastMessage(
                AppStrings.message_logged_in_successfully);
            Navigator.of(context, rootNavigator: true).pop();
            Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (context) =>  HomePage(
                      userAccesstoken: accessToken,
                      userInterests: res.interests
                    )));
          
    ).catchError((Object obj) 
      switch (obj.runtimeType) 
        case DioError:
          final res = (obj as DioError).response;
          Navigator.of(context, rootNavigator: true).pop();
          logger.e(res.statusMessage);
          AppHelper.showToastMessage(AppStrings.message_something_went_wrong);
          break;
      
    );
  

我用过

Navigator.of(context, rootNavigator: true).pop(); 

用于关闭对话框

我没有收到任何错误,但我希望当用户按下主屏幕应用程序上的后退按钮进入后台并且当用户从后台打开该应用程序时显示主屏幕而不是登录屏幕

告诉我我在导航中出错的地方以及如何解决它。

【问题讨论】:

您好,您必须在登录成功时保存会话中的值,并在每次启动屏幕上检查它,如果用户登录则打开主页,否则打开登录 【参考方案1】:

你要找的方法是pushReplacement,要走的路是:

Navigator.of(context).pop();
Navigator
  .of(context)
  .pushReplacement(
    MaterialPageRoute(
      builder: (BuildContext context) => InterestsPage(
    userAccesstoken: accessToken,
    )
  )
)

这样,它会弹出警告消息,然后将之前的所有页面替换为您想要的页面。

但是,是否需要显示登录页面的逻辑归结为偏好,因为如果没有附加代码,我无法说明如何做到这一点。例如,我在登录后将用户存储在本地数据库中。这样,即使没有连接,也可以访问应用程序。

【讨论】:

【参考方案2】:

你应该在你的主文件上使用路由,使用 PushReplacement 效果很好,没有问题,你应该决定在哪里导航用户,如果用户之前登录过,你可以使用类似@987654321 @ 来实现这个功能。登录后只需保存一个用户已登录的首选项,然后在您的初始屏幕上将用户导航到正确的屏幕

【讨论】:

没有必要这样做,因为您可以在验证登录后替换之前的路由。 @AntónioOliveira 那么您如何决定应用关闭后的导航位置? 不应使用共享首选项来保存信息。您可以将它用于临时信息,但您应该只在运行时使用它。对于他的情况,关于用户的持久化信息需要更持久一些,因此建议使用结构良好的本地数据库来进行此类检查。一些信息很好,但一段时间后,它会变得混乱。此外,他没有使用路由,因此最好的解决方案是不要为他拥有的东西实施替代方案。

以上是关于如何在flutter中登录后禁用用户返回的主要内容,如果未能解决你的问题,请参考以下文章

注销后禁用浏览器“返回”按钮?

基于是新登录还是返回用户在 Flutter 中导航屏幕

Flutter 1.12 后如何禁用 proguard?

如何在 Flutter 中创建登录墙视图

在 Flutter 中 - 从 Web 浏览器中的 PayPal 完成交易页面返回后,如何将用户推送到应用程序中的“谢谢”页面

如何在 Flutter 中启用/禁用 Firebase Crashlytics