Flutter中的本地存儲
上期回顧
在上一篇文章中我們學習了在Dart中的非同步操作,你以為我沒事啊還特地給你們專門寫一篇文章啊,當然是有用的啊。
想必大家都知道所有的文件操作都是耗時的,那麼肯定都是要在非同步下進行的,不然的話那就真的要讓用戶死等啊,所以非同步操作在文件的存儲過程中顯得異常的重要。
好吧,還是回歸今天的主題,我們還是來看下Flutter中的本地存儲吧
Flutter本地存儲
和Android、Ios類似,Flutter也支持Preferences(Shared Preferences and NSUserDefaults) 、文件、和Sqlite3。
只不過要想使用這個功能需要引入官方倉庫的相應插件,那麼我們就分別來看下這三種存儲方式的使用方法。
Preferences存儲
Flutter中本身並不支持Preferences存儲,需要藉助於第三發的組件來實現。
打開https://github.com/flutter/plugins
或者https://pub.dartlang.org/flutter
可以在上面找到需要官方和第三方提供的其他組件,我們使用的shared_preferences就是其中的一個,打開shared_preferences插件對象的頁面即可看到插件相關的信息
現在我們需要在項目裡面引入shared_preferences插件
第三發插件的引用
打開項目的pubspec.yaml配置我文件在dependencies:節點下新增如下配置
shared_preferences: 「^0.4.1」
點擊開發工具提示的packages get按鈕或者在命令行輸入flutter packages get來同步第三方插件
在自己的Dart文件中引入插件即可正常使用了
import 『package:shared_preferences/shared_preferences.dart』;
下面還是舉個例子來說明下
實現輸入一段字元串進行保存和獲取操作
GIF
還是直接來看代碼:
首先我們創建了一個TextField用來獲取用戶輸入,然後我們再下面定義看了連個按鈕,每噹噹即存儲按鈕都會觸發save() 方法,每當點擊獲取按鈕都會觸發get()方法。
接下來我們還是來看下這兩個方法裡面做了什麼吧。
在上面save方法中我們可以看到我們給它加上了async和await關鍵字,因為SharedPreferences的存貯也是一個輕量級的耗時操作,所以我們也是需要在非同步中進行的。
我們使用SharedPreferences.getInstance()方法來實例化SharedPreferences對象,使用它的setString方法來存儲用戶輸入的字元串。
setString(key, value)
其中key就是你存貯的名稱,value就是你存儲的值
當然,SharedPreferences里有很多存儲其他對象的方法比如:
prefs.setBool(key, value)
prefs.setDouble(key, value)
prefs.setInt(key, value)
prefs.setStringList(key, value)
接下來來看下get方法
在get方法中我們同樣實例化了一個SharedPreferences對象,並且調用SharedPreferences的getString方法來獲取我們存入的對象。
getString(key)
key就是我們剛才存入的值,我們通過這個值可以在本地查找到我們存入的對象並返回。
同樣的,get方法也是耗時操作,同樣需要非同步執行,我們使用async和await來使得get方法非同步並返回了一個泛型為String的Future對象。
我們使用獲得的Future對象調用then()方法,當get方法執行完後就會自動觸發then()方法裡面的操作彈出showSnackBar。
好吧,咱們還是去android目錄下看下這個SharedPreferences文件在不在吧
嗯,其實也不難吧,接下來,來看下文件操作吧。
文件存儲
和SharedPreferences操作一樣,Flutter內部並沒有提供對本地文件的支持,但是官方給我們提供了第三方的支持庫哦。
同樣的方法,我們需要在pubspec.yaml文件中引入
path_provider: ^0.4.0
然後調用flutter packages get
最後在自己的Dart文件中引入
import 『package:path_provider/path_provider.dart』;
即可使用Flutter中的文件存儲
在path_provider中有三個獲取文件路徑的方法:
getTemporaryDirectory()//獲取應用緩存目錄,等同IOS的NSTemporaryDirectory()和Android的getCacheDir() 方法
getApplicationDocumentsDirectory()獲取應用文件目錄類似於Ios的NSDocumentDirectory和Android上的 AppData目錄
getExternalStorageDirectory()//這個是存儲卡,僅僅在Android平台可以使用
下面我們就以把文件存在應用文件目錄舉個例子
好吧,原諒我比較懶,界面還是上面的界面,只不過我們把上面的save和get方法變了下。
首先我們先獲取存儲目錄
然後在本地建立文件(不存在這個名字的自動創建並返回,存在則直接返回這個文件對象),名字就叫做
nameFile吧。
然後就是存儲輸入框內的內容了
我們使用上面獲取到的文件直接直接調用writeAsString即可,當然它會把這個文件對象返回給你,你可以存儲下這個文件對象在下次使用
最後,我們來讀取本地的文件
我們直接調用file的readString方法來獲取字元串並返回泛型為String的Future對象
然後我們還是使用上面的代碼通過Future的then方法來回去反悔的數據並showSnackBar
好吧,我們還是去看下,這個名字為nameFile.txt文件是否存在。
果不其然,它靜靜的躺在那裡,哈。
最後,我們來看下Flutter中Sqlite的用法
Sqlite
和SharedPreferences和文件操作操作一樣,Flutter內部並沒有提供對sqlite的支持,但是官方給我們提供了第三方的支持庫哦。
同樣的方法,我們需要在pubspec.yaml文件中引入
sqflite: >=0.8.5
然後調用flutter packages get
最後在自己的Dart文件中引入
import 『package:sqflite/sqflite.dart』;
即可在Flutter使用Sqlite
同樣的,我慢還是先貼代碼:
首先,我們需要獲取一下我們資料庫存儲的目錄,資料庫名字為name.db
然後建立庫和數據表,並返回泛型為Database的Future對象(我們這裡是使用的失去了語句建立的數據表操作,大家可以根據自己需要定製相應的ORM映射庫)
我們建立了一個表名為user 主鍵為id,一個Text類型name的數據表。
接著,我們拿著這個Database對象就可以存儲數據了
這裡我們在事務里執行sql語句
然後,我們點擊獲取按鈕,獲取數據
這裡我們的查詢操作直接返回了一個List
最後,我們在點擊事件觸發獲取到相應值並處理
好吧,下面來看下效果
GIF
我們在來看下應用目錄下有沒有這個資料庫文件吧
可以看到資料庫文件已經在應用目錄下了,資料庫文件我就不拿出來看了哈
其實,今天提到的本地存儲操作都是比較簡單,大家可以在下面多多試一試相應的操作,因為在以後的應用開發過程中會用的很多的。^筆芯^
小結
可以在https://pub.dartlang.org/flutter獲取第三發插件
在pubspec.yaml引入或者更新第三發插件
SharedPreferences、文件、資料庫操作都是命耗時操作,需要非同步執行
試一試
今天的我們對SharedPreferences、文件、資料庫獲取的Future對象都是通過async和await獲得的,那麼大家在下面嘗試把今天獲取Future的方式改為 Future api方式去獲取並完成今天的例子。
TAG:flutter開發者 |