flutter: 用getxservice管理状态
一,安装所需的库:flutter_secure_storage
地址:
https://pub.dev/packages/flutter_secure_storage/install
安装:
dependencies:
flutter_secure_storage: ^10.0.0
二,代码
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');
}
main中初始化
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'services/AuthService.dart';
import 'routes/routes.dart';
void main() {
Get.put(AuthService());
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return GetMaterialApp(
debugShowCheckedModeBanner: false, //去除debug图标
defaultTransition: Transition.rightToLeft, //指定动画
theme: ThemeData(primarySwatch: Colors.red),
initialRoute: "/", //初始化页面
getPages: APPage.routes, //路由
);
}
}
页面中调用:
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../services/AuthService.dart';
class HomePage extends StatefulWidget {
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
var authServ = Get.find<AuthService>();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: const Text("home页面"),
),
body: Center(
child:Column(
children:[
ElevatedButton(
child: Text("跳转到detail页面"),
onPressed: () {
Get.toNamed("/detail",arguments: {
"id":20,
"name":"苏东坡新传",
});
},
),
SizedBox(
height: 30,
),
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号