无需方法/事件通道:Flutter如何读取Android原生SharedPreferences或合并存储文件?
解决方案
一、共用同一个SharedPreferences文件(推荐)
Flutter的shared_preferences插件在Android端本质是基于原生SharedPreferences实现的,默认使用FlutterSharedPreferences作为偏好名称(对应FlutterSharedPreferences.xml)。要和原生的myprefs.xml共用,只需修改插件初始化时的偏好名称:
- 打开Android项目的
MainActivity.kt(或MainActivity.java) - 在
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
相关产品推荐
相关产品推荐

