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

无需方法/事件通道:Flutter如何读取Android原生SharedPreferences或合并存储文件?

解决方案

一、共用同一个SharedPreferences文件(推荐)

Flutter的shared_preferences插件在Android端本质是基于原生SharedPreferences实现的,默认使用FlutterSharedPreferences作为偏好名称(对应FlutterSharedPreferences.xml)。要和原生的myprefs.xml共用,只需修改插件初始化时的偏好名称:

  1. 打开Android项目的MainActivity.kt(或MainActivity.java)
  2. 在configureFlutterEngine方法中指定原生的偏好名称:

Kotlin代码示例:

import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin

class MainActivity : FlutterActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        // 替换成原生使用的偏好名称"myprefs"
        SharedPreferencesPlugin.setPreferencesName(flutterEngine, "myprefs")
    }
}

Java代码示例:

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin;

public class MainActivity extends FlutterActivity {
    @Override
    public void configureFlutterEngine(FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        // 替换成原生使用的偏好名称"myprefs"
        SharedPreferencesPlugin.setPreferencesName(flutterEngine, "myprefs");
    }
}

修改完成后,Flutter和原生就会共用myprefs.xml文件,不再生成两个独立的存储文件。

二、读取原生无前缀的键值

由于shared_preferences插件默认会给所有键添加flutter.前缀,直接读取原生的键(比如username)会找不到对应值,可通过以下方式解决:

方式1:原生端同步键名到带前缀的键

在原生App启动时,将原生SharedPreferences中的键值对复制到带flutter.前缀的键下。比如在原生的Application类或MainActivity的onCreate方法中添加逻辑:

// Kotlin示例
val nativePrefs = getSharedPreferences("myprefs", MODE_PRIVATE)
val flutterPrefs = getSharedPreferences("myprefs", MODE_PRIVATE)
val editor = flutterPrefs.edit()

// 遍历原生所有键,复制到带flutter.前缀的键
for (key in nativePrefs.all.keys) {
    if (!key.startsWith("flutter.")) {
        val value = nativePrefs.all[key]
        when (value) {
            is String -> editor.putString("flutter.$key", value)
            is Int -> editor.putInt("flutter.$key", value)
            is Boolean -> editor.putBoolean("flutter.$key", value)
            is Float -> editor.putFloat("flutter.$key", value)
            is Long -> editor.putLong("flutter.$key", value)
        }
    }
}
editor.apply()

之后在Flutter中直接使用原生的键名(比如username)即可读取到对应值,插件会自动匹配带前缀的键。

方式2:Flutter端手动构造读取逻辑(不推荐)

如果不想修改原生代码,可通过自定义方法绕过插件的前缀处理,但这种方式仅适用于Android平台,不具备跨平台兼容性,实际场景中更推荐使用前一种同步方案。

注意事项

  • 修改偏好名称后,之前Flutter存储在FlutterSharedPreferences.xml中的数据会无法访问,需提前考虑数据迁移方案。
  • 确保原生和Flutter使用相同的偏好模式(默认是MODE_PRIVATE),避免出现权限问题。

内容的提问来源于stack exchange,提问作者Sonu Saini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:02:40