You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:51:18