Flutter中是否有Xamarin.Forms Application.Current.Properties等价功能
Flutter 中匹配 Xamarin.Forms
Application.Current.Properties 的等价实现 Flutter 框架本身没有内置和 Application.Current.Properties 完全同名同API的组件,但通过官方生态组合可以100%复现其全部能力:应用级全局访问、基础类型键值对存取、本地持久化、应用重启后数据保留,甚至灵活度更高。
能力匹配拆解
Xamarin.Forms 中 Application.Current.Properties 的核心能力可以拆成两部分,Flutter里对应实现非常成熟:
- 全局可访问:不需要在页面间层层传递参数,应用任意代码位置都能读写属性
- 自动持久化:写入的属性会自动存到平台本地存储,应用杀进程重启后依然可以读取,支持
int/string/bool/double等基础数据类型
落地实现方案
最贴近原API使用体验的方案是用单例做全局访问入口,搭配官方维护的shared_preferences做持久化层,这个插件底层和Xamarin的属性存储逻辑完全一致:安卓端调用系统SharedPreferences存储,iOS端调用NSUserDefaults存储,数据持久化可靠性和原API完全对齐。
第一步:封装全局属性类
直接写一个单例类对齐原API的使用习惯,代码如下:
import 'package:shared_preferences/shared_preferences.dart'; class AppProperties { static final AppProperties _instance = AppProperties._internal(); factory AppProperties() => _instance; AppProperties._internal(); late final SharedPreferences _prefs; /// 应用启动时初始化一次即可 Future<void> init() async { _prefs = await SharedPreferences.getInstance(); } /// 读取属性 T? get<T>(String key) { return _prefs.get(key) as T?; } /// 写入属性,写入后自动持久化 Future<void> set<T>(String key, T value) async { switch (T) { case int: _prefs.setInt(key, value as int); break; case String: _prefs.setString(key, value as String); break; case bool: _prefs.setBool(key, value as bool); break; case double: _prefs.setDouble(key, value as double); break; case List<String>: _prefs.setStringList(key, value as List<String>); break; } } /// 移除单个属性 Future<void> remove(String key) async { await _prefs.remove(key); } /// 清空所有全局属性 Future<void> clear() async { await _prefs.clear(); } }
第二步:应用启动时初始化
在main函数入口完成初始化,避免后续读写时空指针:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 初始化全局属性存储 await AppProperties().init(); runApp(const MyApp()); }
第三步:全局任意位置读写
不需要传参,任何业务代码里都可以直接调用,和Xamarin的使用体验几乎无差别:
// 存储属性 await AppProperties().set<bool>("hasAgreePrivacy", true); await AppProperties().set<String>("userToken", "xxxxxx"); // 读取属性 bool? hasAgree = AppProperties().get<bool>("hasAgreePrivacy"); String? token = AppProperties().get<String>("userToken");
扩展说明
- 如果需要存储自定义实体类,只需要把对象序列化为JSON字符串后存储,读取时反序列化为对象即可,支持的数据类型范围比Xamarin原API更广
- 如果项目中已经接入了全局状态管理(比如Provider、Riverpod、GetX),也可以把持久化实例挂载到全局状态中,不需要单独写单例,适配现有项目架构即可
- 这个实现的持久化逻辑是异步写入,和Xamarin.Forms中Properties的写入时机表现一致,不需要担心数据丢失问题
内容的提问来源于stack exchange,提问作者Luis Estrada
相关产品推荐
相关产品推荐

