Flutter认证状态管理插件auth_state_manager的使用
Flutter认证状态管理插件auth_state_manager的使用
Auth State Manager
Auth State Manager 帮助您监控应用程序中的认证变化。如果您在应用中使用HTTP请求并且需要访问API的令牌,这个包非常适合。该包会将访问令牌保存到共享偏好设置,并在需要时返回它。
安装
- 在
pubspec.yaml
文件中添加最新版本的包(并运行dart pub get
):
dependencies:
auth_state_manager: ^0.1.1
- 在
main.dart
中导入包:
import 'package:auth_state_manager/auth_state_manager.dart';
- 初始化
AuthStateManager
。- 确保在
main()
函数中添加async
。 - 确保通过
WidgetsFlutterBinding.ensureInitialized();
初始化FlutterBinding
。 - 确保使用
await
初始化AuthStateManager
。
- 确保在
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await AuthStateManager.initializeAuthState();
runApp(
const MaterialApp(
home: MyApp(),
),
);
}
使用
- 将您的根部件用
AuthStateListener
包裹,并提供authenticated
和unAuthenticated
状态下的部件。这将帮助您控制应用的认证流程。如果没有授权,AuthStateListener
返回unAuthenticated
部件;如果已登录,则返回authenticated
部件。
[@override](/user/override)
Widget build(BuildContext context) {
return const AuthStateListener(
authenticated: MainScreen(),
unAuthenticated: LoginScreen(),
);
}
- 通过以下方式将您的访问令牌保存到
AuthState
:
await AuthStateManager.instance.setToken('MyToken');
注意:setToken()
是异步方法,所以要确保 await
它。请注意,保存您的令牌不会触发认证状态的变化。要更改认证状态,应该使用 login()
方法。
final bool isSuccessful =
await AuthStateManager.instance.setToken('MyToken');
if (isSuccessful) {
AuthStateManager.instance.login();
}
- 通过以下方式删除访问令牌并注销:
AuthStateManager.instance.logOut();
logOut()
方法将删除访问令牌并触发认证状态变化。
- 通过以下方式监听认证状态的变化:
late final StreamSubscription _authStateSub;
@Override
void initState() {
super.initState();
_authStateSub = AuthStateManager.instance.authStateAsStream.listen((state) {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('isAuthenticated: $state'),
),
);
});
}
@Override
void dispose() {
super.dispose();
_authStateSub.cancel();
}
AuthStateManager.instance.authStateAsStream
返回一个 Stream<bool>
,您可以对其进行监听。
示例
以下是完整的示例代码:
import 'dart:async';
import 'package:auth_state_manager/auth_state_manager.dart';
import 'package:flutter/material.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await AuthStateManager.initializeAuthState();
runApp(
const MaterialApp(
home: MyApp(),
),
);
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late final StreamSubscription _authStateSub;
[@override](/user/override)
void initState() {
super.initState();
_authStateSub = AuthStateManager.instance.authStateAsStream.listen((state) {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('isAuthenticated: $state'),
),
);
});
}
[@override](/user/override)
void dispose() {
super.dispose();
_authStateSub.cancel();
}
[@override](/user/override)
Widget build(BuildContext context) {
return const AuthStateListener(
authenticated: MainScreen(),
unAuthenticated: LoginScreen(),
);
}
}
class MainScreen extends StatelessWidget {
const MainScreen({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Auth State Manager'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text(
'Authenticated',
style: TextStyle(
fontSize: 24,
),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () {
AuthStateManager.instance.logOut();
},
child: const Text(
'Sign Out',
style: TextStyle(
fontSize: 16,
),
),
),
],
),
),
);
}
}
class LoginScreen extends StatelessWidget {
const LoginScreen({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Auth State Manager'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text(
'UnAuthenticated',
style: TextStyle(
fontSize: 24,
),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
final bool isSuccessful =
await AuthStateManager.instance.setToken('MyToken');
if (isSuccessful) {
AuthStateManager.instance.login();
}
},
child: const Text(
'Log in',
style: TextStyle(
fontSize: 16,
),
),
),
],
),
),
);
}
}
更多关于Flutter认证状态管理插件auth_state_manager的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter认证状态管理插件auth_state_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,auth_state_manager
是一个用于 Flutter 的认证状态管理插件,它可以帮助开发者更方便地管理用户的认证状态。以下是一个基本的代码示例,展示了如何使用 auth_state_manager
插件来管理用户的认证状态。
首先,确保你已经在 pubspec.yaml
文件中添加了 auth_state_manager
依赖:
dependencies:
flutter:
sdk: flutter
auth_state_manager: ^最新版本号 # 请替换为实际最新版本号
然后,运行 flutter pub get
来获取依赖。
接下来,我们可以创建一个简单的 Flutter 应用,展示如何使用 auth_state_manager
。
1. 创建 AuthService 类
首先,我们需要创建一个 AuthService
类来处理实际的认证逻辑(这里只是模拟,实际应用中应替换为真实的认证服务)。
import 'package:auth_state_manager/auth_state_manager.dart';
class AuthService implements AuthInterface {
// 模拟用户数据
bool _isAuthenticated = false;
String? _userId;
@override
Future<void> signIn(String email, String password) async {
// 模拟登录过程
await Future.delayed(Duration(seconds: 2));
_isAuthenticated = true;
_userId = 'user_123';
notifyListeners(); // 通知监听器认证状态已更改
}
@override
Future<void> signOut() async {
// 模拟登出过程
_isAuthenticated = false;
_userId = null;
notifyListeners(); // 通知监听器认证状态已更改
}
@override
bool get isAuthenticated => _isAuthenticated;
@override
String? get userId => _userId;
// 注意:notifyListeners() 方法需要在 AuthInterface 中定义,或者你可以通过其他方式通知状态变化
}
2. 创建 AuthProvider 类
接下来,我们创建一个 AuthProvider
类,它将使用 AuthServiceManager
来管理认证状态。
import 'package:auth_state_manager/auth_state_manager.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'auth_service.dart';
final authProvider = Provider<AuthService>((ref) {
return AuthService();
});
final authStateManager = AuthStateManagerProvider<AuthService>(
(ref) => ref.watch(authProvider),
);
3. 使用 AuthStateManager 在 UI 中显示认证状态
最后,我们在 Flutter UI 中使用 AuthStateManager
来显示和响应认证状态的变化。
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'auth_provider.dart';
void main() {
runApp(
ProviderScope(
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: AuthScreen(),
);
}
}
class AuthScreen extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final authState = ref.watch(authStateManager.state);
return Scaffold(
appBar: AppBar(
title: Text('Auth Demo'),
),
body: Center(
child: authState.when(
unauthenticated: () => Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('You are not logged in'),
ElevatedButton(
onPressed: () async {
final authService = ref.read(authProvider);
await authService.signIn('test@example.com', 'password');
},
child: Text('Sign In'),
),
],
),
authenticated: (userId) => Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('You are logged in as $userId'),
ElevatedButton(
onPressed: () async {
final authService = ref.read(authProvider);
await authService.signOut();
},
child: Text('Sign Out'),
),
],
),
),
),
);
}
}
在这个示例中,我们创建了一个简单的 Flutter 应用,它使用 auth_state_manager
来管理用户的认证状态。用户可以通过点击按钮登录和登出,UI 会根据当前的认证状态动态更新。
请注意,这个示例使用了 flutter_riverpod
作为状态管理解决方案,因为 auth_state_manager
通常与 flutter_riverpod
一起使用。如果你不熟悉 flutter_riverpod
,建议先学习其基本用法。