前言
做过android开发的人都知道,可以利用SharedPreferences这个轻量级的存储类来保存键值对信息,在Flutter中,我们可以使用shared_preferences库来同时支持Android和ios平台。
参考:
使用介绍
- 在
pubspec.yaml
文件中添加依赖
shared_preferences: "^0.4.2"
添加的位置如图所示:
-
安装依赖库 执行
$ flutter packages get
命令 -
在相应文件中导入该库
import 'package:shared_preferences/shared_preferences.dart';
- 增删改查 增:
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString(key, value)
prefs.setBool(key, value)
prefs.setDouble(key, value)
prefs.setInt(key, value)
prefs.setStringList(key, value)
其中key就是你存贮的名称,value就是你存储的值 删:
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.remove(key); //删除指定键
prefs.clear();//清空键值对
改:
改和增是一样的,只需要再执行一次setXXX()方法即可覆盖之前的数据。
查:
使用示例
首先我们创建了一个TextField用来获取用户输入,然后我们再下面定义看了连个按钮,每当当即存储按钮都会触发save() 方法,每当点击获取按钮都会触发get()方法。 先来看看save()方法
save() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString(mUserName, _userNameController.value.text.toString());
}
在上面save方法中我们可以看到我们给它加上了async和await关键字,因为SharedPreferences的存贮也是一个轻量级的耗时操作,所以我们也是需要在异步中进行的。 我们使用SharedPreferences.getInstance()方法来实例化SharedPreferences对象,使用它的setString方法来存储用户输入的字符串。
setString(key, value)
接下来来看下get
方法
Future<String> get() async {
var userName;
SharedPreferences prefs = await SharedPreferences.getInstance();
userName = await prefs.getString(mUserName);
return userName;
}
在get
方法中我们同样实例化了一个SharedPreferences对象,并且调用SharedPreferences的getString方法来获取我们存入的对象。
getString(key)
中key就是我们刚才存入的值,我们通过这个值可以在本地查找到我们存入的对象并返回。
同样的,get
方法也是耗时操作,同样需要异步执行,我们使用async
和await
来使得get方法异步并返回了一个泛型为String的Future
对象。
Future<String> userName = get();
userName.then((String userName) {
Scaffold.of(context).showSnackBar(
SnackBar(content: Text("数据获取成功:$userName")));
});
我们使用获得的Future
对象调用then()
方法,当get方法执行完后就会自动触发then()方法里面的操作弹出showSnackBar。
下面给出完整代码:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
runApp(new MaterialApp(home: new MyApp()));
}
class MyApp extends StatelessWidget {
final String mUserName = "userName";
final _userNameController = new TextEditingController();
@override
Widget build(BuildContext context) {
save() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString(mUserName, _userNameController.value.text.toString());
}
Future<String> get() async {
var userName;
SharedPreferences prefs = await SharedPreferences.getInstance();
userName = prefs.getString(mUserName);
return userName;
}
return new Builder(builder: (BuildContext context) {
return new Scaffold(
appBar: AppBar(
title: Text("SharedPreferences"),
),
body: Center(
child: new Builder(builder: (BuildContext context){
return
Column(
children: <Widget>[
TextField(
controller: _userNameController,
decoration: InputDecoration(
contentPadding: const EdgeInsets.only(top: 10.0),
icon: Icon(Icons.perm_identity),
labelText: "请输入用户名",
helperText: "注册时填写的名字"),
),
RaisedButton(
color: Colors.blueAccent,
child: Text("存储"),
onPressed: () {
save();
Scaffold.of(context).showSnackBar(
new SnackBar(content: Text("数据存储成功")));
}),
RaisedButton(
color: Colors.greenAccent,
child: Text("获取"),
onPressed: () {
Future<String> userName = get();
userName.then((String userName) {
Scaffold.of(context).showSnackBar(
SnackBar(content: Text("数据获取成功:$userName")));
});
}),
],
);
}),
),
);
});
}
}
键值对文件存放路径