Flutter认证状态管理插件auth_state_manager的使用

Flutter认证状态管理插件auth_state_manager的使用

Auth State Manager

Auth State Manager 帮助您监控应用程序中的认证变化。如果您在应用中使用HTTP请求并且需要访问API的令牌,这个包非常适合。该包会将访问令牌保存到共享偏好设置,并在需要时返回它。

安装

  1. pubspec.yaml 文件中添加最新版本的包(并运行 dart pub get):
dependencies:
  auth_state_manager: ^0.1.1
  1. main.dart 中导入包:
import 'package:auth_state_manager/auth_state_manager.dart';
  1. 初始化 AuthStateManager
    • 确保在 main() 函数中添加 async
    • 确保通过 WidgetsFlutterBinding.ensureInitialized(); 初始化 FlutterBinding
    • 确保使用 await 初始化 AuthStateManager
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await AuthStateManager.initializeAuthState();
  runApp(
    const MaterialApp(
      home: MyApp(),
    ),
  );
}

使用

  1. 将您的根部件用 AuthStateListener 包裹,并提供 authenticatedunAuthenticated 状态下的部件。这将帮助您控制应用的认证流程。如果没有授权,AuthStateListener 返回 unAuthenticated 部件;如果已登录,则返回 authenticated 部件。
[@override](/user/override)
Widget build(BuildContext context) {
  return const AuthStateListener(
    authenticated: MainScreen(),
    unAuthenticated: LoginScreen(),
  );
}
  1. 通过以下方式将您的访问令牌保存到 AuthState
await AuthStateManager.instance.setToken('MyToken');

注意:setToken() 是异步方法,所以要确保 await 它。请注意,保存您的令牌不会触发认证状态的变化。要更改认证状态,应该使用 login() 方法。

final bool isSuccessful =
    await AuthStateManager.instance.setToken('MyToken');
if (isSuccessful) {
    AuthStateManager.instance.login();
}
  1. 通过以下方式删除访问令牌并注销:
AuthStateManager.instance.logOut();

logOut() 方法将删除访问令牌并触发认证状态变化。

  1. 通过以下方式监听认证状态的变化:
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

1 回复

更多关于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,建议先学习其基本用法。

回到顶部