Flutter本地存儲(chǔ)之基本的鍵值對存儲(chǔ)詳解
前言
在原生的 Android 或 iOS 中,都提供了基本的鍵值對存儲(chǔ)方式,Android 是 SharedPreferences,iOS 是 NSUserDefaults。在 Flutter 中,提供了 shared_preferences 這個(gè)插件來實(shí)現(xiàn)本地鍵值對數(shù)據(jù)存儲(chǔ)。實(shí)際上,shared_preferences 在 Android 就是使用 SharedPreferences 實(shí)現(xiàn),在 iOS 上則是使用 NSUserDefaults 實(shí)現(xiàn)。
基本使用
在 pubspec.yaml 文件中添加以下代碼:
dependencies:
flutter:
sdk: flutter
shared_preferences: ^2.0.18我們將基礎(chǔ)的計(jì)數(shù)應(yīng)用修改為支持從上一次結(jié)果(即存儲(chǔ)在本地的數(shù)值)開始增加。代碼如下:
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
int _counter = 0;
late SharedPreferences _prefs;
@override
void initState() {
super.initState();
_loadCounter();
}
void _loadCounter() async {
_prefs = await SharedPreferences.getInstance();
setState(() {
_counter = (_prefs.getInt('counter') ?? 0);
});
}
void _incrementCounter() async {
setState(() {
_counter++;
});
await _prefs.setInt('counter', _counter);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Shared Preferences 示例'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
),
);
}
}上面的代碼是一個(gè)基礎(chǔ)的計(jì)數(shù)器應(yīng)用,我們定義了一個(gè)_counter變量來保存計(jì)數(shù)器的值,并且使用 SharedPreferences 實(shí)例來存儲(chǔ)和檢索_counter變量的值。 在initState方法中,我們使用_loadCounter方法來加載_counter變量的值。在_loadCounter方法中,我們首先使用SharedPreferences.getInstance() 方法來獲取 SharedPreferences 實(shí)例,然后使用 getInt()方法來檢索 _counter 變量的值。如果檢索到的值為 null,則將 _counter 變量的值設(shè)置為 0。 在 _incrementCounter 方法中,我們使用了setInt方法將 _counter 變量的值保存到 SharedPreferences 實(shí)例中來實(shí)現(xiàn)本地存儲(chǔ)。 運(yùn)行效果如下:

存儲(chǔ)其他類型數(shù)據(jù)
shared_preferences支持存儲(chǔ)的數(shù)據(jù)類型有整型、浮點(diǎn)型(double)、字符串、布爾型和字符串?dāng)?shù)組。如果想存儲(chǔ)對象,也可以通過 json 序列化和反序列化的方式實(shí)現(xiàn)。我們來看一個(gè)更復(fù)雜點(diǎn)的例子。
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
// 初始化需要存儲(chǔ)的值
int _counter = 0;
String _username = '';
bool _isDarkModeEnabled = false;
final _textController = TextEditingController(text: '');
// SharedPreferences 實(shí)例
late SharedPreferences _prefs;
// 加載 SharedPreferences 中存儲(chǔ)的值
Future<void> _loadData() async {
_prefs = await SharedPreferences.getInstance();
setState(() {
_counter = _prefs.getInt('counter') ?? 0;
_username = _prefs.getString('username') ?? '';
_textController.text = _username;
_isDarkModeEnabled = _prefs.getBool('isDarkModeEnabled') ?? false;
});
}
void _incrementCounter() async {
setState(() {
_counter++;
});
await _prefs.setInt('counter', _counter);
}
// 保存用戶名
void _saveUsername(String username) async {
setState(() {
_username = username;
});
await _prefs.setString('username', _username);
}
// 切換暗黑模式
void _toggleDarkMode(bool isDarkModeEnabled) async {
setState(() {
_isDarkModeEnabled = isDarkModeEnabled;
});
await _prefs.setBool('isDarkModeEnabled', _isDarkModeEnabled);
}
@override
void initState() {
super.initState();
_loadData();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter SharedPreferences 示例',
theme: _isDarkModeEnabled ? ThemeData.dark() : ThemeData.light(),
home: Scaffold(
appBar: AppBar(
title: const Text('Flutter SharedPreferences 示例'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'計(jì)數(shù)器的值:$_counter',
),
const SizedBox(height: 20),
TextFormField(
decoration: const InputDecoration(
labelText: '請輸入您的名字',
),
controller: _textController,
onChanged: (value) {
_saveUsername(value);
},
),
const SizedBox(height: 20),
SwitchListTile(
title: const Text('啟用暗黑模式'),
value: _isDarkModeEnabled,
onChanged: (value) {
_toggleDarkMode(value);
},
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: '遞增計(jì)數(shù)器的值',
child: const Icon(Icons.add),
),
),
);
}
}上述代碼增加了兩個(gè)類型的存儲(chǔ),分別是字符串和布爾型,存儲(chǔ)方式其實(shí)是類似的,布爾型使用 getBool 獲取、setBool 存儲(chǔ);字符串則是使用 getString和 setString。我們通過布爾型變量控制是否啟用暗黑模式,使用字符串類存儲(chǔ)用戶名。下面是運(yùn)行的結(jié)果。

總結(jié)
可以看到shared_preferences 非常簡單,因此可以應(yīng)用在簡單的鍵值對存儲(chǔ)中,典型的就是我們在本地?fù)Q成后端的SessionId、記住用戶名和密碼、或者默認(rèn)的勾選項(xiàng)等等。然后基于這些存儲(chǔ)的數(shù)據(jù)做默認(rèn)值顯示和業(yè)務(wù)規(guī)則控制、或填充到請求表單里。對于復(fù)雜的業(yè)務(wù)對象存儲(chǔ),則需要使用 SQL數(shù)據(jù)庫或者是 NoSQL 數(shù)據(jù)庫。
到此這篇關(guān)于Flutter本地存儲(chǔ)之基本的鍵值對存儲(chǔ)詳解的文章就介紹到這了,更多相關(guān)Flutter鍵值存儲(chǔ)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android與JS之間跨平臺(tái)異步調(diào)用實(shí)例詳解
這篇文章主要介紹了Android與JS之間跨平臺(tái)異步調(diào)用實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-11-11
Android自定義控件實(shí)現(xiàn)球賽比分條效果
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)球賽比分條效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Flutter進(jìn)階質(zhì)感設(shè)計(jì)之標(biāo)簽欄
這篇文章主要為大家詳細(xì)介紹了Flutter進(jìn)階質(zhì)感設(shè)計(jì)之標(biāo)簽欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
Android布局加載之LayoutInflater示例詳解
這篇文章主要介紹了Android布局加載之LayoutInflater的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考借鑒價(jià)值,需要的朋友們下面來一起看看吧。2017-03-03
Android recycleView的應(yīng)用和點(diǎn)擊事件實(shí)例詳解
這篇文章主要介紹了Android recycleView的應(yīng)用和點(diǎn)擊事件實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12
Android編程之ProgressBar圓形進(jìn)度條顏色設(shè)置方法
這篇文章主要介紹了Android編程之ProgressBar圓形進(jìn)度條顏色設(shè)置方法,涉及ProgressBar布局及屬性設(shè)置相關(guān)操作技巧,需要的朋友可以參考下2017-02-02
Android中實(shí)現(xiàn)為TextView添加多個(gè)可點(diǎn)擊的文本
這篇文章主要介紹了Android中實(shí)現(xiàn)為TextView添加多個(gè)可點(diǎn)擊的文本,可實(shí)現(xiàn)類似Android社交軟件顯示點(diǎn)贊用戶并通過用戶名稱進(jìn)入該用戶主頁的功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09

