flutter: 判断是否登录,未登录则跳转到login页面
一,结构
二,代码:
functions
import 'package:get/get.dart';
import '../services/AuthService.dart';
//检查是否登录,如未登录则跳转到登录页
void GetToNamedAuth(name,args) {
var authServ = Get.find<AuthService>();
bool isLogin = authServ.isLoggedIn.value;
if (isLogin == true) {
Get.toNamed(name,arguments: args);
} else {
//跳转到login页面,把要跳转到的地址也写入到args这个map中
args['destPageName'] = name;
Get.toNamed("/login",arguments: args);
}
}
authservice
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');
}
}
homepage
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:mylist2/utils/functions.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: () {
var args = {
"id":20,
"name":"苏东坡新传",
};
GetToNamedAuth("/detail", args);
},
),
],
),
),
);
}
}
loginpage
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../services/AuthService.dart';
class LoginPage extends StatefulWidget {
@override
State<LoginPage> createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
var authServ = Get.find<AuthService>();
var args = Get.arguments;
String destPage = "/"; //要跳转的页面:默认是首页
@override
Widget build(BuildContext context) {
//得到要跳转的页面
if (args.containsKey('destPageName')) {
destPage = args['destPageName'];
args.remove('destPageName');
}
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: const Text("login页面"),
),
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 {
Get.toNamed(destPage,arguments: args);
},
),
],
),
),
);
}
}
detailpage
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class DetailPage extends StatefulWidget {
@override
State<DetailPage> createState() => _DetailPageState();
}
class _DetailPageState extends State<DetailPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.surfaceContainer,
title: const Text("detail页面"),
),
body: Center(
child: ElevatedButton(
child: Text("返回home页面"),
onPressed: () {
print("接收到的参数:");
print(Get.arguments);
print("参数:id:");
print(Get.arguments['id']);
print("参数:name:");
print(Get.arguments['name']);
Get.back();
},
),
),
);
}
}
三,测试效果:


浙公网安备 33010602011771号