From b691b032b25ded5d43e946455ea0f8503dec782b Mon Sep 17 00:00:00 2001 From: Simon Ding Date: Wed, 17 Jul 2024 18:33:50 +0800 Subject: [PATCH] feat: change logout button --- ui/lib/main.dart | 53 ++++++++++++++++++++++++++++--------- ui/lib/providers/APIs.dart | 19 ++++++++----- ui/lib/providers/login.dart | 2 -- 3 files changed, 53 insertions(+), 21 deletions(-) diff --git a/ui/lib/main.dart b/ui/lib/main.dart index 510e634..3b06b23 100644 --- a/ui/lib/main.dart +++ b/ui/lib/main.dart @@ -50,18 +50,41 @@ class MyApp extends StatelessWidget { IconButton( onPressed: () => context.go(SystemSettingsPage.route), icon: const Icon(Icons.settings)), - APIs.isLoggedIn - ? IconButton( - onPressed: () async { - final SharedPreferences prefs = - await SharedPreferences.getInstance(); - await prefs.remove('token'); - if (context.mounted) { - context.go(LoginScreen.route); - } - }, - icon: const Icon(Icons.exit_to_app)) - : Container() + FutureBuilder( + future: APIs.isLoggedIn(), + builder: (context, snapshot) { + if (snapshot.hasData && snapshot.data == true) { + return MenuAnchor( + menuChildren: [ + MenuItemButton( + leadingIcon: const Icon(Icons.exit_to_app), + child: const Text("登出"), + onPressed: () async { + final SharedPreferences prefs = + await SharedPreferences.getInstance(); + await prefs.remove('token'); + if (context.mounted) { + context.go(LoginScreen.route); + } + }, + ), + ], + builder: (context, controller, child) { + return TextButton( + onPressed: () { + if (controller.isOpen) { + controller.close(); + } else { + controller.open(); + } + }, + child: const Icon(Icons.account_circle), + ); + }, + ); + } + return Container(); + }) ], ), body: Center( @@ -73,7 +96,11 @@ class MyApp extends StatelessWidget { child: NavDrawer(), ), const VerticalDivider(thickness: 1, width: 1), - Flexible(flex: 7, child: Padding(padding: const EdgeInsets.all(20),child: child), ) + Flexible( + flex: 7, + child: + Padding(padding: const EdgeInsets.all(20), child: child), + ) ]))), ); }, diff --git a/ui/lib/providers/APIs.dart b/ui/lib/providers/APIs.dart index 3cdca86..590f728 100644 --- a/ui/lib/providers/APIs.dart +++ b/ui/lib/providers/APIs.dart @@ -44,22 +44,29 @@ class APIs { static Dio? gDio; static Map authHeaders = {}; - static bool isLoggedIn = false; - static Future getDio() async { - if (gDio != null) { - return gDio!; - } + static Future isLoggedIn() async { + return isNotBlank(await getToken()); + } + + static Future getToken() async { var token = authHeaders["Authorization"]; if (isBlank(token)) { final SharedPreferences prefs = await SharedPreferences.getInstance(); var t = prefs.getString("token"); if (isNotBlank(t)) { authHeaders["Authorization"] = t!; - isLoggedIn = true; token = t; } } + return token ?? ""; + } + + static Future getDio() async { + if (gDio != null) { + return gDio!; + } + var token = await getToken(); var dio = Dio(); dio.interceptors.add(InterceptorsWrapper( diff --git a/ui/lib/providers/login.dart b/ui/lib/providers/login.dart index 74c420e..fa4371e 100644 --- a/ui/lib/providers/login.dart +++ b/ui/lib/providers/login.dart @@ -1,8 +1,6 @@ import 'dart:async'; -import 'package:dio/dio.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:shared_preferences/shared_preferences.dart'; import 'package:ui/providers/APIs.dart'; import 'package:ui/providers/server_response.dart';