當前位置:
首頁 > 最新 > Flutter中的本地存儲

Flutter中的本地存儲

上期回顧

在上一篇文章中我們學習了在Dart中的非同步操作,你以為我沒事啊還特地給你們專門寫一篇文章啊,當然是有用的啊。

想必大家都知道所有的文件操作都是耗時的,那麼肯定都是要在非同步下進行的,不然的話那就真的要讓用戶死等啊,所以非同步操作在文件的存儲過程中顯得異常的重要。

好吧,還是回歸今天的主題,我們還是來看下Flutter中的本地存儲吧


和Android、Ios類似,Flutter也支持Preferences(Shared Preferences and NSUserDefaults) 、文件、和Sqlite3。

只不過要想使用這個功能需要引入官方倉庫的相應插件,那麼我們就分別來看下這三種存儲方式的使用方法。

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的用法

和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方式去獲取並完成今天的例子。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 flutter開發者 的精彩文章:

兩個不是很新的新聞

TAG:flutter開發者 |