Flutter 全局变量及共享状态
2025-09-30 08:47
Flutter
0
0
0
0
标题录入
封面图
在 Flutter 中,**全局变量**和**共享状态**是开发中非常常见的需求。根据应用的复杂程度,你可以选择不同的方式来管理这些状态。下面是一些常用的方法: --- ## 一、Flutter 中的全局变量与共享状态管理方法 ### 1. **使用 `Provider`(推荐)** `Provider` 是 Flutter 官方推荐的状态管理库,适用于大多数中小型应用。 #### ✅ 优点: - 简单易用 - 高性能 - 支持多种状态管理方式(如 `ChangeNotifier`, `Stream`, `Future` 等) #### 示例代码: ```dart // 1. 创建一个可变的模型类(继承自 ChangeNotifier) class AppModel with ChangeNotifier { int _count = 0; int get count => _count; void increment() { _count++; notifyListeners(); } } // 2. 在 main.dart 中注册 Provider void main() { runApp( ChangeNotifierProvider( create: (context) => AppModel(), child: MyApp(), ), ); } // 3. 在 Widget 中访问 class MyWidget extends StatelessWidget { @override Widget build(BuildContext context) { final model = Provider.of<AppModel>(context); return Text('Count: ${model.count}'); } } ``` --- ### 2. **使用 `Riverpod`(更现代的 Provider 替代方案)** `Riverpod` 是 `Provider` 的改进版本,解决了 `Provider` 的一些局限性(比如依赖注入问题)。 #### ✅ 优点: - 更灵活 - 不需要 `BuildContext` - 更适合大型项目 #### 示例代码: ```dart // 1. 定义一个 StateProvider final counterProvider = StateProvider<int>((ref) => 0); // 2. 在 Widget 中读取 class MyWidget extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final count = ref.watch(counterProvider); return Text('Count: $count'); } } // 3. 修改值 ref.read(counterProvider.notifier).state++; ``` --- ### 3. **使用 `SharedPreferences`(持久化存储)** 如果你需要保存用户偏好或临时数据,可以使用 `shared_preferences` 插件。 #### ✅ 优点: - 数据持久化 - 跨页面/跨会话可用 #### 示例代码: ```dart import 'package:shared_preferences/shared_preferences.dart'; Future<void> saveData(String key, String value) async { final prefs = await SharedPreferences.getInstance(); await prefs.setString(key, value); } Future<String?> getData(String key) async { final prefs = await SharedPreferences.getInstance(); return prefs.getString(key); } ``` --- ### 4. **使用 `GlobalKey`(不推荐用于状态管理)** 虽然 `GlobalKey` 可以获取 widget 的引用,但不建议用于状态管理,容易导致难以维护的代码。 --- ### 5. **使用 `Singleton` 模式(简单场景)** 对于简单的全局变量,可以创建一个单例类。 #### 示例代码: ```dart class AppGlobals { static final AppGlobals _instance = AppGlobals._internal(); factory AppGlobals() => _instance; AppGlobals._internal(); int count = 0; } ``` 使用方式: ```dart AppGlobals().count = 10; print(AppGlobals().count); ``` ⚠️ 注意:这种方式不适合复杂的 UI 更新,因为不会自动触发重建。 --- ## 二、推荐方案总结 | 方案 | 适用场景 | 推荐度 | |--------------|------------------------|--------| | `Provider` | 中小型应用 | ⭐⭐⭐⭐⭐ | | `Riverpod` | 大型项目或需要灵活性 | ⭐⭐⭐⭐⭐ | | `SharedPreferences` | 需要持久化的数据 | ⭐⭐⭐⭐ | | `Singleton` | 简单全局变量 | ⭐⭐⭐ | --- ## 三、进阶方案(适用于复杂应用) | 方案 | 说明 | |--------------|------------------------------| | `Bloc` | 基于事件驱动的状态管理 | | `GetX` | 快速开发的轻量级状态管理 | | `MobX` | 响应式编程 | | `Redux` | 类似 React 的 Redux 模式 | --- 如果你告诉我你具体的应用场景(比如是否需要持久化、是否需要响应式更新等),我可以帮你推荐最合适的方案 😊
上一篇:
Flutter Github客户端示例
下一篇:
Flutter 网络请求封装
标题录入,一次不能超过6条
返回顶部
留言
留言
评论