针对Flutter:从其他页面访问存储的Sharedpreference值和flutter页面传值这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展AndroidSharedPreferenc
针对Flutter:从其他页面访问存储的Sharedpreference值和flutter页面传值这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Android SharedPreferences存储的正确写法、android – Flutter中的SharedPreferences错误、android – 如何强制PreferenceActivity处理我的SharedPreferences?、android – 将SharedPreferences文件保存到自定义目录或获取默认的SharedPreferences目录等相关知识,希望可以帮助到你。
本文目录一览:- Flutter:从其他页面访问存储的Sharedpreference值(flutter页面传值)
- Android SharedPreferences存储的正确写法
- android – Flutter中的SharedPreferences错误
- android – 如何强制PreferenceActivity处理我的SharedPreferences?
- android – 将SharedPreferences文件保存到自定义目录或获取默认的SharedPreferences目录
Flutter:从其他页面访问存储的Sharedpreference值(flutter页面传值)
我将值存储在名为的页面中page1.dart
。我想从page2.dart
或访问存储的值page3.dart
。我该如何实现?
答案1
小编典典我在第一个屏幕中存储了一个字符串,然后通过以下代码从第二个屏幕中检索了存储的值
第1页:
import ''package:flutter/material.dart'';import ''package:shared_preferences/shared_preferences.dart'';import ''package:trial/class2.dart'';void main() => runApp(MyApp());class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: MyHomePage(), ); }}class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState();}class _MyHomePageState extends State<MyHomePage> { String _email = ''''; @override void initState() { super.initState(); _loadCounter(); } _loadCounter() async { SharedPreferences prefs = await SharedPreferences.getInstance(); setState(() { _email = (prefs.getString(''email'') ?? ''''); }); } _incrementCounter() async { SharedPreferences prefs = await SharedPreferences.getInstance(); setState(() { _email = "a@gmail.com"; }); prefs.setString(''email'', _email); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("title"), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( ''$_email'', ), new RaisedButton( child: new Text("next2"), onPressed: () { Navigator.push(context, new MaterialPageRoute(builder: (context) => new Next())); }, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, child: Icon(Icons.add), ), ); }}
第2页:
import ''package:flutter/material.dart'';import ''package:shared_preferences/shared_preferences.dart'';String _email='''';class Next extends StatefulWidget { @override _NextState createState() => _NextState();}class _NextState extends State<Next> { @override void initState() { super.initState(); _loadCounter(); } _loadCounter() async { SharedPreferences prefs = await SharedPreferences.getInstance(); setState(() { _email = (prefs.getString(''email'')??''''); }); } @override Widget build(BuildContext context) { return Container( child: new Text("read value from sharepreference is:"+_email), ); }}
Android SharedPreferences存储的正确写法
SharedPreferences 特点
即便是Android小白都知道的SharedPreferences的用法,这是保存数据最简便的方法,但是不处理好的话后期维护将是一个巨大的坑。那么该如何处理好SharedPreferences才方便维护呢。先从它的特点开始入手吧。
- 通过Context.getSharedPreferences()获取的SharedPreferences是一个单例
- SharedPreferences.edit()每次都会创建一个新的编辑对象,commit()之前一切改动都无效
SharedPreferences的具体实现并不在公开API内,创建方法只有通过Context获取。具体实现我们不去研究,通过Log打印每次获取的对象都是同一个,同样的方法可知道每次edit()都会得到不同的对象。
难以维护的 SharedPreferences
SharedPreference userPreferences = context.getSharedPreferences("UserInfo",Context.MODE_PRIVATE); userPreferences.edit() .putString("id","myId") .putString("name","myName") .putString("head","myHead") .commit(); Log.e("id",userPreferences.getString("id","")); Log.e("name",userPreferences.getString("name","")); Log.e("head",userPreferences.getString("head",""));
如上一段SharedPreferences保存和读取的方法非常简便,正因此才不易维护,可能因为写错Key而找不出问题所在,当然一般我们都会把Key写成静态常量。但随着项目增大,可能需要多处修改用户信息,每次都要一个个put(),除了写着厌烦看着难受,当遇到需要增加或减少字段时也非常不便。
SharedPreferences 该这么写
如果能保留原有写法,又能规范方法那是最好不过了,看下SharedPreferences的接口方法并不多,很容易就写个包装类封装下。
import android.content.SharedPreferences; import android.support.annotation.Nullable; import java.util.Map; import java.util.Set; /** * SharedPreferences 包装类 * Created by wittytutu on 17-3-29. */ public class PreferencesWrapper implements SharedPreferences { protected SharedPreferences mPreferences; public PreferencesWrapper(SharedPreferences preferences) { mPreferences = preferences; } @Override public Map getAll() { return mPreferences.getAll(); } @Nullable @Override public String getString(String key,@Nullable String defValue) { return mPreferences.getString(key,defValue); } @Nullable @Override public Set getStringSet(String key,@Nullable Set defValues) { return mPreferences.getStringSet(key,defValues); } @Override public int getInt(String key,int defValue) { return mPreferences.getInt(key,defValue); } @Override public long getLong(String key,long defValue) { return mPreferences.getLong(key,defValue); } @Override public float getFloat(String key,float defValue) { return mPreferences.getFloat(key,defValue); } @Override public boolean getBoolean(String key,boolean defValue) { return mPreferences.getBoolean(key,defValue); } @Override public boolean contains(String key) { return mPreferences.contains(key); } @Override public EditorWrapper edit() { return new EditorWrapper(mPreferences.edit()); } @Override public void registerOnSharedPreferencechangelistener(OnSharedPreferencechangelistener listener) { mPreferences.registerOnSharedPreferencechangelistener(listener); } @Override public void unregisterOnSharedPreferencechangelistener(OnSharedPreferencechangelistener listener) { mPreferences.unregisterOnSharedPreferencechangelistener(listener); } public static class EditorWrapper implements Editor { protected Editor mEditor; public EditorWrapper(Editor editor) { mEditor = editor; } @Override public EditorWrapper putString(String key,@Nullable String value) { mEditor.putString(key,value); return this; } @Override public EditorWrapper putStringSet(String key,@Nullable Set values) { mEditor.putStringSet(key,values); return this; } @Override public EditorWrapper putInt(String key,int value) { mEditor.putInt(key,value); return this; } @Override public EditorWrapper putLong(String key,long value) { mEditor.putLong(key,value); return this; } @Override public EditorWrapper putFloat(String key,float value) { mEditor.putFloat(key,value); return this; } @Override public EditorWrapper putBoolean(String key,boolean value) { mEditor.putBoolean(key,value); return this; } @Override public EditorWrapper remove(String key) { mEditor.remove(key); return this; } @Override public EditorWrapper clear() { mEditor.clear(); return this; } @Override public boolean commit() { return mEditor.commit(); } @Override public void apply() { mEditor.apply(); } } }
接下来的使用就简单了
public class UserInfoPreferences extends PreferencesWrapper { private static final String NAME = "UserInfo"; public static final KEY_ID = "id" public static final KEY_NAME = "name"; public static final KEY_HEAD = "head"; public static final KEY_SEX = "sex"; private static volatile UserInfoPreferences mPreferences; public static UserInfoPreferences getInstance(Context context){ if(mPreferences == null) { synchronized (UserInfoPreferences.class){ if(mPreferences == null) { SharedPreferences preferences = context.getApplicationCtontext().getShaedPreferences(NAME,Context.MODE_PRIVATE); mPreferences = new UserInfoPreferences(preferences); } } } return mPreferences; } public UserInfoPreferences(SharedPreferences preferences) { super(preferences); } // 获取用户信息 public UserInfo getUserInfo(){ String id = mPreferences.getString(KEY_ID,""); String name = mPreferences.getString(KEY_NAME,""); String head = mPreferences.getString(KEY_HEAD,""); return new UserInfo(id,name,head); } @Override public Editor edit(){ return new Editor(mPreferences.edit()); } public static class Editor extends EditorWrapper { public Editor(SharedPreferences.Editor editor) { super(editor); } // 保存用户信息 public Editor putUserInfo(String id,String name,String head) { mEditor.putString(KEY_ID,id) .putString(KEY_AME,name) .putString(KEY_HEAD,head); return this; } // 清空用户信息 public Editor clearUserInfo() { mEditor.remove(KEY_ID) .remove(KEY_NAME) .remove(KEY_HEAD); return this; } } }
调用即方便扩展,也保留了原有方法。
UserInfoPreferences preferences = UserInfoPreferences.getInstance(context); preferences.edit() .clearUserInfo() .putUserInfo("myId","myName","myHead") .putInt(KEY_SEX,0) .commit(); UserInfo userInfo = preferences.getUserInfo(); int sex = preferences.getInt(KEY_SEX,0);
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
android – Flutter中的SharedPreferences错误
我在Flutter应用程序中使用了shared_preferences插件.从一个时刻开始(可能是在Flutter升级之后),它开始抛出异常:
E/Flutter (27778): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/Flutter (27778): type '_InternalLinkedHashMap' is not a subtype of type 'Map<String, Object>' where
E/Flutter (27778): _InternalLinkedHashMap is from dart:collection
E/Flutter (27778): Map is from dart:core
E/Flutter (27778): String is from dart:core
E/Flutter (27778): Object is from dart:core
E/Flutter (27778):
E/Flutter (27778): #0 SharedPreferences.getInstance (package:shared_preferences/shared_preferences.dart)
E/Flutter (27778): <asynchronous suspension>
E/Flutter (27778): #1 loadFirstUse (**path**/lib/main.dart:29:53)
E/Flutter (27778): <asynchronous suspension>
E/Flutter (27778): #2 main (**path**/lib/main.dart:17:9)
E/Flutter (27778): <asynchronous suspension>
E/Flutter (27778): #3 _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:279:19)
E/Flutter (27778): #4 _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:165:12)
当我简单地尝试创建SharedPreferences的实例时,就会发生这种情况:
SharedPreferences prefs = await SharedPreferences.getInstance();
我试图找到问题的根源,但无法找到它.感谢您的任何帮助.
编辑:我正在使用shared_preferences:“^ 0.4.0”
解决方法:
我尝试过shared_preferences:“0.2.4”和上面提出的其他版本没有任何成功.最后,在将sputter频道从dev变为beta之后,它就开始工作了:
Flutter channel beta
至少这个现在解决了这个问题,只是等待修改dev通道上的shared_preferences插件.
android – 如何强制PreferenceActivity处理我的SharedPreferences?
SharedPreferences mSharedPreferences = getSharedPreferences("MyPrefs",0);
我已经实现了PreferenceActivity,因此用户可以通过它更改值,但它发生的是读取/写入数据不是“MyPrefs”,而是:
PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
这对我来说有点意外.是否可以强制PreferenceActivity处理我的“MyPrefs”偏好?在单个应用程序中有多个首选项有什么意义?谢谢.
解决方法
I get access to it like this
这没关系,只要你不打算使用PreferenceActivity.
I’ve implemented PreferenceActivity so users can change values through it
哎呀.
另外,除非你有特定的理由使用Application而不是activity / service / whatever,否则在那里摆脱getApplicationContext().只有在必要时才使用Application对象,并且您知道为什么必须这样做.
Is that possible to force PreferenceActivity to deal with my “MyPrefs” preferences?
不容易.除非你有一些特定的理由发明你自己的SharedPreferences文件,否则我会使用默认的.
And what is the point to have several preferences within single application?
您可能有一个可重用的库或组件想要在SharedPreferences中存储内容,并且可能有自己的文件,以免弄乱托管应用程序中的任何首选项.话虽如此,通常不需要多个首选项文件.
android – 将SharedPreferences文件保存到自定义目录或获取默认的SharedPreferences目录
或者是否可以检索目录SharedPreferences默认保存到?
附:硬编码路径/data/data/package.name/shared_prefs/不是解决方案.
解决方法
Or is it possible to retrieve the directory SharedPreferences are
saved by default to?
是.
这基本上是您可以从ApplicationInfo对象获取的dataDir / shared_prefs(反过来您可以从PackageManager获取). (另外,它可能与“getFilesDir”目录相同,你可以从Context本身轻松获得?不确定,没有检查.)
从源代码开始,以Context.getSharedPreferences(ContextImpl source)开头:
public SharedPreferences getSharedPreferences(String name,int mode) { SharedPreferencesImpl sp; File prefsFile; boolean needInitialLoad = false; synchronized (sSharedPrefs) { sp = sSharedPrefs.get(name); if (sp != null && !sp.hasFileChangedUnexpectedly()) { return sp; } prefsFile = getSharedPrefsFile(name); ... public File getSharedPrefsFile(String name) { return makeFilename(getPreferencesDir(),name + ".xml"); } private File getPreferencesDir() { synchronized (mSync) { if (mPreferencesDir == null) { mPreferencesDir = new File(getDataDirFile(),"shared_prefs"); } return mPreferencesDir; } } private File getDataDirFile() { if (mPackageInfo != null) { return mPackageInfo.getDataDirFile(); } throw new RuntimeException("Not supported in system context"); }
而“mPackageInfo”是LoadedApk的一个实例:
public File getDataDirFile() { return mDataDirFile; } mDataDirFile = mDataDir != null ? new File(mDataDir) : null; mDataDir = aInfo.dataDir;
这将我们带回到ApplicationInfo.
我想说如果你不想依赖于convention / data / data /< package_name> / shared_prefs,那么获取“dataDir”并从那里依赖“shared_prefs”应该是安全的吗?
关于Flutter:从其他页面访问存储的Sharedpreference值和flutter页面传值的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Android SharedPreferences存储的正确写法、android – Flutter中的SharedPreferences错误、android – 如何强制PreferenceActivity处理我的SharedPreferences?、android – 将SharedPreferences文件保存到自定义目录或获取默认的SharedPreferences目录的相关信息,请在本站寻找。
本文标签: