簡體   English   中英

如何使用 GetX 在 Flutter 中使 function 返回可觀察?

[英]How to make a function return observable in Flutter using GetX?

我正在嘗試將使用有狀態小部件和提供程序 package 的代碼轉換為使用無狀態小部件和 GetX package 的代碼,但我不知道我可以為以下吸氣劑 ZC1C425268E683895D114ZA 做什么?

  bool get isAuth {
    return token != null;
  }

這個function檢查token是否存在,令牌本身來自以下function:

  String? get token {
    if (_expiryDate != null &&
        _expiryDate!.isAfter(DateTime.now()) &&
        _token != null) {
      return _token;
    }
    return null;
  }

我不知道如何修改這部分代碼以使isAuth變量可觀察,然后我可以在main.dart中使用它來將應用程序引導到身份驗證屏幕或主屏幕?

編輯:我嘗試了@SM JAHANGIR 在答案中建議的代碼,但我不知道我應該為main.dart文件中的Obx部分做什么? 以下是主要的main.dart文件:

void main() {
  Get.put(MenuController());
  Get.put(NavigationController());
  Get.put(AuthController());
  Get.put(AuthCard);
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      initialRoute: Obx(()=>AuthController.instance.isAuth
          ? homeScreenRoute
          : authenticationScreenRoute),

      unknownRoute: GetPage(
          name: '/not-found',
          page: () => PageNotFound(),
          transition: Transition.fadeIn),
      getPages: [
        GetPage(
            name: rootRoute,
            page: () {
              return SiteLayout();
            }),
        GetPage(
            name: authenticationScreenRoute,
            page: () => const AuthenticationScreen()),
        GetPage(name: homeScreenRoute, page: () => HomeScreen()),
      ],
      debugShowCheckedModeBanner: false,
      title: 'BasicCode',
      theme: ThemeData(
        scaffoldBackgroundColor: light,
        textTheme: GoogleFonts.mulishTextTheme(Theme.of(context).textTheme)
            .apply(bodyColor: Colors.black),
        pageTransitionsTheme: const PageTransitionsTheme(builders: {
          TargetPlatform.iOS: FadeUpwardsPageTransitionsBuilder(),
          TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(),
        }),
        primarySwatch: Colors.blue,
      ),
      // home: AuthenticationPage(),
    );
  }
}

對於這行代碼initialRoute: Obx(()=>AuthController.instance.isAuth? homeScreenRoute: authenticationScreenRoute) ,我收到以下錯誤消息:

參數類型“Obx”不能分配給參數類型“String?”。

我也試過initialRoute: Obx(()=> AuthController.instance.isAuth? homeScreenRoute: authenticationScreenRoute) as String? 但它給了我一個新的錯誤:

根據閉包上下文的要求,返回類型“String”不是“Widget”。

如果您想讓isAuth getter 可觀察,您可以簡單地執行以下操作:

RxBool get isAuth {
   return RxBool(token != null);
 }

但更方便的方法是:

final _isAuth = false.obs;

bool get isAuth {
 _isAuth.value= token != null;
 return _isAuth.value;
}

並像這樣使用它:

Obx(()=> isAuth? codeIfAuthenticated: codeIfNotAuthenticated)

initialRoute將 String 作為參數,您不能為其分配widget 嘗試這個:

    Obx(() => 
       GetMaterialApp(
         initialRoute: AuthController.instance.isAuth ? homeScreenRoute : authenticationScreenRoute
       );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM