前言
做過android開發的人都知道,可以利用SharedPreferences這個輕量級的存儲類來保存鍵值對信息,在Flutter中,我們可以使用shared_preferences庫來同時支持Android和ios平臺。
參考:
1.《Flutter中的本地存儲》
- 《Flutter知識點:數據存儲之SharedPreferences》
- shared_preferences 0.4.2
使用介紹
- 在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;
}
/<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>
鍵值對文件存放路徑
閱讀更多 僱個城管打天下y 的文章