在项目里我们经常会用到 SharedPreferences 在设备本地存储一些数据,这里每次都需要先执行这个 SharedPreferences 上面的 getInstance ,然后再使用它上面的一些方法去设置,获取或者移除数据。 下面我们可以定义一个类,在上面添加一些静态方法,用这些方法去做这些事情。
打开 app_service.dart,在这个文件里可以再定义一个类,名字是 AppStorage, 先定义一个存储数据用的方法,用 static 标记一下,表示这是一个静态方法,方法返回的东西是 Future
声明一个 prefs 等于 await ,执行 SharedPreferences.getInstance() , 方法 return 的是 prefs.setString,第一个参数是 key,第二个参数是 data。
setObject
下面再定义一个存储对象数据用的方法,复制一份这个 setString ,名字换成 setObject ,一个 key 参数,一个 value 参数,这个 value 的类型设置成 Object。
存储这个数据的时候,同样用的是 ShardPreferences 里的 setString ,数据的名字是 key,要存储的值可以用 jsonEncode 处理一下 value 参数的值。
使用这个数据的时候,可以用 getString 方法把它提取出来,然后用 jsonDecode 转换一下。
remove
下面再定义一个移除数据用的方法,先用 static 标记一下,类型是 Future
getString
然后定义一个获取数据用的方法,static Future
最后 return 的是一个 Future.value,把 data 交给它。
getMap
再定义一个静态方法,返回的值的类型是 Future
再声明一个 prefs ,等于 await ,用一下 SharedPreferences.getInstance() ,然后声明一个 result,等于 prefs.getString,把 key 交给它。 下面判断一下 result 是不是不等于 null ,如果是的话,就让 data 等于 jsonDecode 处理一下 result 。 最后让这个方法 return data。
使用
下面我们可以用一下这里定义的这些方法,先打开 auth_model.dart,这里有个 storeAuth 方法,改进一下这个方法,用一下 AppStorage.setObject ,存储一个数据,名字叫 auth,值是 auth 。 这个 set 方法存储这个 auth 数据的时候,会先用 jsonEncode 处理一下它。
removeAuth 要删除掉存储的名字是 auth 的数据,执行一下 AppStorage.remove ,要移除的数据的名字是 auth。
app.dart
打开 app.dart,找到 initialize 这个方法,再改进一下这个方法,删除掉这两行代码,这里可以声明一个 data,等于 await AppStorage.getMap,要获取的数据的名字是 auth ,这个 getMap 方法会把存储的数据提取出来,然后用 jsonDecode 处理一下,再返回处理之后的结果。
下面判断一下 data 是不是不等于 null ,如果是的话,声明一个 auth,用 Auth.fromJson ,直接把 data 交给这个方法。
post_index_model.dart
打开 post_index_model.dart,这里有个 storeLayout 方法,它要在本地存储一个数据,删除掉这里的这两行代码,改进一下,用一下 AppStorage.setString('postListLayout', data.toString());
post_list.dart
再打开 post_list.dart, 这里有个 restoreLayout 方法,它里面要获取本地存储的数据,用一下await AppStorage.getString 这个方法数据的名字叫 postListLayout。
测试
现在处理存储在本地设备上的数据用的是我们自己定义的方法,所以在这些文件里就不用再导入这个 shared_preferences 这个包了,可以从这些文件里,把导入这个包用的代码全部都删除掉。
最后再测试一下,打开用户,按一下登录,输入用户名,还有这个用户的密码,登录一下。成功以后会存储身份验证相关的数据。
再打开发现,修改一下列表的布局,然后可以打开调试,重新启动一下应用。列表布局保持不变,再打开用户,用户的登录状态也恢复了。