flutter:getx: 用GetxService管理全局状态

一,比较GetxController 和 GetxService 的区别

1,两者的区别:

GetxController:

GetxController 用于管理特定页面或 widget 的状态。每个页面或 widget 可以拥有一个或多个 GetxController,用于管理其自身的状态和逻辑。
GetxController 是短暂存在的,通常与页面或 widget 的生命周期相关联。它们在页面或 widget 销毁时被销毁。
GetxService:

GetxService 用于全局状态管理和持久化服务。它们在整个应用程序生命周期中是单例存在的,并且负责处理应用程序范围内的状态和服务。
GetxService 通常用于管理全局性的业务逻辑、持久化数据、全局状态等,它们不会随着页面或 widget 的销毁而销毁。

2,两者的使用场景:

GetxController 的使用场景:

管理特定页面或 widget 的状态和逻辑。
处理特定页面或 widget 的用户交互和数据更新。
GetxService 的使用场景:

管理全局性的业务逻辑、全局状态和持久化数据。
处理应用程序级别的服务,例如用户登录状态、数据缓存、全局设置等。

二,代码:

1,service类

import 'package:get/get.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';

class AuthService extends GetxService {
  final storage = FlutterSecureStorage();
  //是否登录
  RxBool isLoggedIn = false.obs;
  //用户token
  RxString userToken = "".obs;

  //登录
  Future<void> login(String tokenStr) async {
    await storage.write(key: 'token', value: tokenStr);
    isLoggedIn.value = true;
    userToken.value = tokenStr;
  }

  //退出
  Future<void> logout() async {
    await storage.delete(key: 'token');
    isLoggedIn.value = false;
    userToken.value = "";
  }

  //从磁盘读取保存的数据
  Future<void> getDataFromDisk() async {
    String? value = await storage.read(key: 'token');
    if (value == null) {
      print("数据不存在");
      isLoggedIn.value = false;
      userToken.value = "";
    } else {
      print("读取到数据"+value);
      isLoggedIn.value = true;
      userToken.value = value;
    }
  }

  @override
  void onInit() {
    super.onInit();
    getDataFromDisk();
    print('AuthService initialized');
  }

  @override
  void onClose() {
    super.onClose();
    print('AuthService closed');
  }
}

2,在main中初始化

void main() {
  Get.put(AuthService());
  runApp(new MyApp());
}

3,在页面中调用:

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';

import '../../services/AuthService.dart';

class TokenPage extends StatefulWidget {
  @override
  State<TokenPage> createState() => _TokenPageState();
}

class _TokenPageState extends State<TokenPage>  {

  final storage = FlutterSecureStorage();
  var authServ = Get.find<AuthService>();
  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text("token页面"),
      ),

      body: Center(
        child:Column(
          children:[

            Obx(() => Text('当前是否登录: ${authServ.isLoggedIn.value}')),
            Obx(() => Text('当前用户token: ${authServ.userToken.value}')),
            SizedBox(
              height: 30,
            ),
            ElevatedButton(
              child: Text("登录"),
              onPressed: () async {
                  authServ.login('老刘123321');
              },
            ),
            SizedBox(
              height: 30,
            ),
            ElevatedButton(
              child: Text("退出"),
              onPressed: () async {
                authServ.logout();
              },
            ),
          ],
        ),

      ),

    );
  }

}

 

三,测试效果

登录后

退出后:

 

posted @ 2025-04-26 08:37  刘宏缔的架构森林  阅读(448)  评论(0)    收藏  举报