前言
Flutter
是Google
開源的構(gòu)建用戶界面(UI
)工具包喉祭,幫助開發(fā)者通過一套代碼庫高效構(gòu)建多平臺精美應(yīng)用,支持移動爆办、Web
难咕、桌面和嵌入式平臺。Flutter
開源距辆、免費余佃,擁有寬松的開源協(xié)議,適合商業(yè)項目挑格。目前咙冗,Flutter
已推出穩(wěn)定的2.0版本。也是目前最火的跨平臺開發(fā)工具之一
文件系統(tǒng)
Android
和IOS
由于系統(tǒng)差異漂彤,在文件系統(tǒng)中有不同的處理雾消,這里需要使用到Google
官方的插件path_provider
添加插件依賴
在pubspec.yaml
文件中添加依賴
dependencies:
path_provider: ^1.6.14
然后執(zhí)行命令
flutter pub get
如果在運行命令時候出現(xiàn)
Waiting for another flutter command to release the startup lock...
則需要
- 結(jié)束掉
Dart.exe
進(jìn)程
2.刪除掉flutter sdk
下面的/bin/cache/lockfile
文件即可
等待命令執(zhí)行完畢,就可以在目錄下看到以及下載好的插件
Android的文件存儲
-
內(nèi)部存儲
此存儲區(qū)域只有當(dāng)前應(yīng)用可以訪問挫望,其他應(yīng)用無法正常訪問立润,是應(yīng)用的獨立存儲區(qū)域,路徑為data/data/包名
,包名目錄下放置了應(yīng)用的獨立存儲區(qū)域媳板,一般情況下我們在Native Android
的開發(fā)中會將應(yīng)用程序需要使用的一些資源文件桑腮,以及SharedPrefrence
文件放置到files
目錄中在
flutter
應(yīng)用中:app_flutter
目錄放置flutter相關(guān)的資源文件
cache
目錄用于放置緩存文件由系統(tǒng)管理
code_cache
目錄放置flutter
相關(guān)的代碼以及資源
files
目錄放置應(yīng)用需要使用到的資源文件,比如web
資源等內(nèi)部存儲特點
- 只能由當(dāng)前應(yīng)用程序訪問相對安全蛉幸,但是如果設(shè)備
Root
之后則具有安全隱患 - 當(dāng)應(yīng)用卸載之后會進(jìn)行刪除破讨,不會占用額外的內(nèi)存丛晦,但是也需要考慮數(shù)據(jù)的生命周期,也不建議直接存儲用戶數(shù)據(jù)
- 不用申請權(quán)限可以直接使用
- 只能由當(dāng)前應(yīng)用程序訪問相對安全蛉幸,但是如果設(shè)備
-
外部存儲
外部存儲主要是指設(shè)備的SD卡提陶,是整個設(shè)備共享的區(qū)域烫沙,由于其由安全風(fēng)險,所以需要申請外部文件讀寫權(quán)限才可使用
IOS的文件存儲
每個IOS
程序都有一個獨立的文件存儲沙盒子區(qū)域隙笆,并且只能使用這部分進(jìn)行文件存儲锌蓄,外部無法進(jìn)行訪問,也無法操作外部
path_provider 的使用
如果在運行時提示
don't support null safety:
則需要添加 --no-sound-null-safety
即可忽略此錯誤
getExternalStorageDirectory
可以獲取外部存儲撑柔,它返回一個Future
對象瘸爽,他表示未來會返回內(nèi)容,所以在使用時需要"等等"它
Future<Directory>
獲取并顯示外部存儲路徑
getData() async {
Directory d = await getExternalStorageDirectory();
setState(() {
path = d.path;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home'),
centerTitle: true,
),
body: Text(path)
);
}
記錄app每點擊一次記錄時間
class HomePageStates extends State<HomePage>
with SingleTickerProviderStateMixin {
String data = "";
@override
void initState() {
super.initState();
}
getFile() async {
Directory directory = await getExternalStorageDirectory();
File file = File(directory.path + "/test");
if (!file.existsSync()) {
file.create();
}
return file;
}
readData() async {
File file = await getFile();
String str = await file.readAsString();
setState(() {
data = str;
});
}
writeData() async {
File file = await getFile();
DateTime date = DateTime.now();
file.writeAsStringSync(
"${date.year}年${date.month}月${date.day}日${date.hour}時${date.minute}分${date.second}秒\n",
mode: FileMode.append);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home'),
centerTitle: true,
),
body: Container(
alignment: Alignment.center,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('$data'),
Ink(
decoration: BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(20)),
child: InkWell(
borderRadius: BorderRadius.circular(20),
onTap: () {
readData();
},
splashColor: Colors.white,
child: Container(
width: 100,
height: 40,
alignment: Alignment.center,
child: Text(
'Get',
style: TextStyle(color: Colors.white),
),
),
),
),
Container(
margin: EdgeInsets.fromLTRB(0, 10, 0, 0),
child: Ink(
decoration: BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(20)),
child: InkWell(
borderRadius: BorderRadius.circular(20),
onTap: () {
writeData();
},
splashColor: Colors.white,
child: Container(
width: 100,
height: 40,
alignment: Alignment.center,
child: Text(
'Write',
style: TextStyle(color: Colors.white),
),
),
),
))
],
),
));
}
}
SharedPrefrence
一般情況下在Android
中我們最常用的是SharedPrefrence
铅忿,一般用來保存一些狀態(tài)數(shù)據(jù)剪决,是否打開過引導(dǎo)頁,是否注冊過指紋等檀训,它是一種key,vakue
的xml
格式的數(shù)據(jù),一般用來保存少量的數(shù)據(jù)昼捍,它是將內(nèi)容保存到了內(nèi)部存儲中也相對安全
添加依賴
shared_preferences: ^0.5.8
數(shù)據(jù)操作
readData() async {
SharedPreferences preferences = await SharedPreferences.getInstance();
bool enabled = preferences.getBool("is_touch_id_enabled");
String time = preferences.getString("last openTime");
setState(() {
data = "$enabled-$time";
});
}
writeData() async {
SharedPreferences preferences = await SharedPreferences.getInstance();
DateTime date = DateTime.now();
preferences.setBool("is_touch_id_enabled", true);
preferences.setString("last openTime",
"${date.year}年${date.month}月${date.day}日${date.hour}時${date
.minute}分${date.second}秒\n");
}
歡迎關(guān)注Mike的簡書
Android 知識整理