【问题标题】:getx redirect middleware as a future functiongetx 重定向中间件作为未来功能
【发布时间】:2022-10-24 22:21:13
【问题描述】:

我需要当用户打开应用程序时,启动画面会打开。闪屏决定用户是去主页还是登录,使用 GetX 层中的中间件。

这个功能:

  @override
  RouteSettings? redirect(String? route) async{ // -> error
 GetSignedInUserInfoRepoImp _sigenedInUser = GetSignedInUserInfoRepoImp();
    if ( await _sigenedInUser.isUserSignedIn()) {
      return const RouteSettings(name:  Routes.HOME);
    } else {
      return const RouteSettings(name:  Routes.SIGN_IN);
    }
  }

但我不能将重定向功能与未来功能一起使用。我应该怎么办?

【问题讨论】:

    标签: flutter flutter-getx


    【解决方案1】:

    GetSignedInUserInfoRepoImp 变成GetxService 并保持用户在此服务中的当前登录状态。根据登录/注销等更改登录状态。

    然后,从GetMiddleware 查询服务:

    // SERVICE
    
    class GetSignedInUserInfoRepoImp extends GetxService {
      final isLoggedIn = false;
    
      bool isUserSignedIn() { 
       return isLoggedIn;
      }
    }
    
    // MIDDLEWARE
    
    @override
    RouteSettings? redirect(String? route) { 
      var _sigenedInUser = Get.find<GetSignedInUserInfoRepoImp>();
      
      if (_sigenedInUser.isUserSignedIn()) {
        return const RouteSettings(name:  Routes.HOME);
      } else {
        return const RouteSettings(name:  Routes.SIGN_IN);
      }
    }
    

    通过 Getx-AppBinding 初始化此服务

    // BINDING
    
    class AppBinding implements Bindings {
      @override
      void dependencies() {
        Get.put<GetSignedInUserInfoRepoImp>(GetSignedInUserInfoRepoImp());
      }
    }
    
    // APP
    
    class MyApp extends StatelessWidget {
      const MyApp({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
    
        return GetMaterialApp(
          initialBinding: AppBinding(),
          home: Home(),
        );
      }  
    }
    

    https://chornthorn.github.io/getx-docs/dependency-management/binding/

    【讨论】:

      【解决方案2】:

      您应该在main() 构建函数中返回GetMaterialApp.router() 而不是GetMaterialApp(),然后根据您的示例使用下面的sn-p 代码:

      @override
        Future<GetNavConfig?> redirectDelegate(GetNavConfig route) async {
          var _sigenedInUser = Get.find<GetSignedInUserInfoRepoImp>();
          bool _isSignedIn = await _sigenedInUser.isUserSignedIn();
          if (_isSignedIn) {
            return Get.rootDelegate.toNamed('/home');
          }else {
            return Get.rootDelegate.toNamed('/sign_in');
          }
          return await super.redirectDelegate(route);
        }
      

      更多信息here

      【讨论】:

        【解决方案3】:

        您可以使用redirectDelegate

         @override
         Future<GetNavConfig?> redirectDelegate(GetNavConfig route) async{
           GetSignedInUserInfoRepoImp _sigenedInUser = GetSignedInUserInfoRepoImp();
          if ( await _sigenedInUser.isUserSignedIn()) {
              return const RouteSettings(name:  Routes.HOME);
          } else {
              return const RouteSettings(name:  Routes.SIGN_IN);
          }
        }
        

        【讨论】:

        • 那是不可能的。如果返回类型为 GetNavConfig,则无法返回 RouteSettings
        猜你喜欢
        • 2021-12-22
        • 2021-07-17
        • 2021-01-03
        • 1970-01-01
        • 2014-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-13
        相关资源
        最近更新 更多