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();
},
),
],
),
),
);
}
}
三,测试效果
登录后

退出后:

浙公网安备 33010602011771号