Skip to content

Commit

Permalink
持久化登入逻辑
Browse files Browse the repository at this point in the history
  • Loading branch information
sanbei101 committed Aug 3, 2024
1 parent 39ebec7 commit 7878631
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 27 deletions.
10 changes: 3 additions & 7 deletions lib/pages/home_page.dart
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
import 'package:flutter/material.dart';
import 'package:flutterchat/components/user_tile.dart';
import 'package:flutterchat/pages/chat_page.dart';
import 'package:flutterchat/service/auth/auth_service.dart';
import 'package:flutterchat/service/chat/chat_service.dart';

class HomePage extends StatelessWidget {
HomePage({super.key});
HomePage({super.key, required this.signOut});
final ChatService _chatService = ChatService();

void logout() {
final AuthService authService = AuthService();
authService.signOut();
}
final VoidCallback signOut;

@override
Widget build(BuildContext context) {
Expand All @@ -25,7 +21,7 @@ class HomePage extends StatelessWidget {
//登出按钮
IconButton(
icon: const Icon(Icons.logout),
onPressed: logout,
onPressed: signOut,
),
],
),
Expand Down
74 changes: 57 additions & 17 deletions lib/service/auth/auth_gate.dart
Original file line number Diff line number Diff line change
@@ -1,29 +1,69 @@
import 'package:flutter/material.dart'; // 导入Flutter的Material库
import 'package:flutterchat/service/auth/login_or_register.dart'; // 导入自定义的登录或注册页面
import 'package:flutterchat/pages/home_page.dart'; // 导入自定义的主页
import 'package:supabase_flutter/supabase_flutter.dart'; // 导入Supabase的Flutter库
import 'package:flutter/material.dart';
import 'package:flutterchat/pages/home_page.dart';
import 'package:flutterchat/service/auth/login_or_register.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';

// 定义一个无状态组件AuthGate
class AuthGate extends StatelessWidget {
const AuthGate({super.key}); // 构造函数,接收一个可选的key参数
class AuthGate extends StatefulWidget {
const AuthGate({super.key});

@override
AuthGateState createState() => AuthGateState();
}

class AuthGateState extends State<AuthGate> {
bool _isLoggedIn = false; // 用于存储用户是否已登录的状态

@override
void initState() {
super.initState();
_checkLoginStatus(); // 初始化时检查登录状态
}

// 检查用户的登录状态并保存登录状态
Future<void> _checkLoginStatus() async {
SharedPreferences prefs =
await SharedPreferences.getInstance(); // 获取SharedPreferences实例
setState(() {
_isLoggedIn =
prefs.getBool('isLoggedIn') ?? false; // 获取存储的登录状态,如果没有则默认为false
});

if (_isLoggedIn) {
final user = Supabase.instance.client.auth.currentUser; // 获取当前Supabase用户
if (user == null) {
setState(() {
_isLoggedIn = false; // 如果Supabase中没有用户信息,则更新状态为未登录
prefs.setBool('isLoggedIn', false); // 同时更新SharedPreferences中的登录状态
});
}
}
}

// 用户登出的方法
Future<void> _signOut() async {
await Supabase.instance.client.auth.signOut(); // 调用Supabase的signOut方法
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool('isLoggedIn', false); // 更新SharedPreferences中的登录状态为未登录
setState(() {
_isLoggedIn = false; // 更新组件状态
});
}

@override
Widget build(BuildContext context) {
return Scaffold(
// 返回一个Scaffold小部件
body: StreamBuilder<AuthState>(
// 使用StreamBuilder监听认证状态的变化
stream: Supabase.instance.client.auth.onAuthStateChange,
stream: Supabase.instance.client.auth.onAuthStateChange, // 监听认证状态变化的流
builder: (context, snapshot) {
// 构建UI
// 如果用户已登录
if (snapshot.hasData &&
snapshot.data!.event == AuthChangeEvent.signedIn) {
return HomePage(); // 返回主页
}

// 如果用户未登录
else {
SharedPreferences.getInstance().then(
(prefs) => prefs.setBool('isLoggedIn', true)); // 如果用户已登录,保存登录状态
return HomePage(signOut: _signOut); // 返回主页,并传递登出方法
} else {
SharedPreferences.getInstance().then((prefs) =>
prefs.setBool('isLoggedIn', false)); // 如果用户未登录,保存未登录状态
return const LoginOrRegister(); // 返回登录或注册页面
}
},
Expand Down
6 changes: 3 additions & 3 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -345,13 +345,13 @@ packages:
source: hosted
version: "0.27.7"
shared_preferences:
dependency: transitive
dependency: "direct main"
description:
name: shared_preferences
sha256: c3f888ba2d659f3e75f4686112cc1e71f46177f74452d40d8307edc332296ead
sha256: c272f9cabca5a81adc9b0894381e9c1def363e980f960fa903c604c471b22f68
url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
source: hosted
version: "2.3.0"
version: "2.3.1"
shared_preferences_android:
dependency: transitive
description:
Expand Down
1 change: 1 addition & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ dependencies:
flutter:
sdk: flutter
supabase_flutter: ^2.5.11
shared_preferences: ^2.3.1

dev_dependencies:
flutter_test:
Expand Down

0 comments on commit 7878631

Please sign in to comment.