前言
做過(guò)android開(kāi)發(fā)的人都知道闺金,可以利用SharedPreferences這個(gè)輕量級(jí)的存儲(chǔ)類(lèi)來(lái)保存鍵值對(duì)信息,在Flutter中贸典,我們可以使用shared_preferences庫(kù)來(lái)同時(shí)支持Android和ios平臺(tái)配乓。
參考:
1.《Flutter中的本地存儲(chǔ)》
使用介紹
- 在
pubspec.yaml
文件中添加依賴(lài)
shared_preferences: "^0.4.2"
添加的位置如圖所示:
安裝依賴(lài)庫(kù)
執(zhí)行$ flutter packages get
命令在相應(yīng)文件中導(dǎo)入該庫(kù)
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就是你存貯的名稱(chēng),value就是你存儲(chǔ)的值
刪:
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.remove(key); //刪除指定鍵
prefs.clear();//清空鍵值對(duì)
改:
改和增是一樣的巢株,只需要再執(zhí)行一次setXXX()方法即可覆蓋之前的數(shù)據(jù)槐瑞。
查:
使用示例
首先我們創(chuàng)建了一個(gè)TextField用來(lái)獲取用戶輸入,然后我們?cè)傧旅娑x看了連個(gè)按鈕阁苞,每當(dāng)當(dāng)即存儲(chǔ)按鈕都會(huì)觸發(fā)save() 方法困檩,每當(dāng)點(diǎn)擊獲取按鈕都會(huì)觸發(fā)get()方法。
先來(lái)看看save()方法
save() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString(mUserName, _userNameController.value.text.toString());
}
在上面save方法中我們可以看到我們給它加上了async和await關(guān)鍵字那槽,因?yàn)镾haredPreferences的存貯也是一個(gè)輕量級(jí)的耗時(shí)操作悼沿,所以我們也是需要在異步中進(jìn)行的。
我們使用SharedPreferences.getInstance()方法來(lái)實(shí)例化SharedPreferences對(duì)象骚灸,使用它的setString方法來(lái)存儲(chǔ)用戶輸入的字符串糟趾。
setString(key, value)
接下來(lái)來(lái)看下get方法
Future<String> get() async {
var userName;
SharedPreferences prefs = await SharedPreferences.getInstance();
userName = await prefs.getString(mUserName);
return userName;
}
在get方法中我們同樣實(shí)例化了一個(gè)SharedPreferences對(duì)象,并且調(diào)用SharedPreferences的getString方法來(lái)獲取我們存入的對(duì)象甚牲。
getString(key)
key就是我們剛才存入的值义郑,我們通過(guò)這個(gè)值可以在本地查找到我們存入的對(duì)象并返回。
同樣的丈钙,get方法也是耗時(shí)操作非驮,同樣需要異步執(zhí)行,我們使用async和await來(lái)使得get方法異步并返回了一個(gè)泛型為String的Future對(duì)象著恩。
Future<String> userName = get();
userName.then((String userName) {
Scaffold.of(context).showSnackBar(
SnackBar(content: Text("數(shù)據(jù)獲取成功:$userName")));
});
我們使用獲得的Future對(duì)象調(diào)用then()方法院尔,當(dāng)get方法執(zhí)行完后就會(huì)自動(dòng)觸發(fā)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: "請(qǐng)輸入用戶名",
helperText: "注冊(cè)時(shí)填寫(xiě)的名字"),
),
RaisedButton(
color: Colors.blueAccent,
child: Text("存儲(chǔ)"),
onPressed: () {
save();
Scaffold.of(context).showSnackBar(
new SnackBar(content: Text("數(shù)據(jù)存儲(chǔ)成功")));
}),
RaisedButton(
color: Colors.greenAccent,
child: Text("獲取"),
onPressed: () {
Future<String> userName = get();
userName.then((String userName) {
Scaffold.of(context).showSnackBar(
SnackBar(content: Text("數(shù)據(jù)獲取成功:$userName")));
});
}),
],
);
}),
),
);
});
}
}