flutter: 判断是否登录,未登录则跳转到login页面

一,结构

image 

二,代码:

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();
          },
        ),
      ),

    );
  }

}

三,测试效果:

 imageimage

 

posted @ 2026-03-03 11:23  刘宏缔的架构森林  阅读(0)  评论(0)    收藏  举报