Flutter数据存储之shared

Flutter数据存储之shared_preferences

前言

做过android开发的人都知道,可以利用SharedPreferences这个轻量级的存储类来保存键值对信息,在Flutter中,我们可以使用shared_preferences库来同时支持Android和ios平台。

参考:

1.《Flutter中的本地存储》

  1. 《Flutter知识点:数据存储之SharedPreferences》
  2. shared_preferences 0.4.2

使用介绍

  1. 在pubspec.yaml文件中添加依赖
shared_preferences: "^0.4.2"

添加的位置如图所示:


Flutter数据存储之shared_preferences


添加依赖

  1. 安装依赖库
  2. 执行$ flutter packages get命令
  3. 在相应文件中导入该库
import 'package:shared_preferences/shared_preferences.dart';
  1. 增删改查
  2. 增:
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()方法即可覆盖之前的数据。

查:


Flutter数据存储之shared_preferences

查询操作的几个API

使用示例


Flutter数据存储之shared_preferences

首先我们创建了一个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;
}
/<string>

在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")));
});
/<string>

我们使用获得的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")));
});
}),
],
);
}),
),
);
});
}
}
/<string>/<widget>/<string>

键值对文件存放路径


Flutter数据存储之shared_preferences



分享到:


相關文章: