前言
Flutter
是Google
开源的构建用户界面(UI
)工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web
、桌面和嵌入式平台。Flutter
开源、免费,拥有宽松的开源协议,适合商业项目。目前,Flutter
已推出稳定的2.0版本。也是目前最火的跨平台开发工具之一
文件系统
Android
和IOS
由于系统差异,在文件系统中有不同的处理,这里需要使用到Google
官方的插件path_provider
添加插件依赖
在pubspec.yaml
文件中添加依赖
dependencies:
path_provider: ^1.6.14
然后执行命令
flutter pub get
如果在运行命令时候出现
Waiting for another flutter command to release the startup lock...
则需要
- 结束掉
Dart.exe
进程
2.删除掉flutter sdk
下面的/bin/cache/lockfile
文件即可
等待命令执行完毕,就可以在目录下看到以及下载好的插件
Android的文件存储
-
内部存储
此存储区域只有当前应用可以访问,其他应用无法正常访问,是应用的独立存储区域,路径为data/data/包名
,包名目录下放置了应用的独立存储区域,一般情况下我们在Native Android
的开发中会将应用程序需要使用的一些资源文件,以及SharedPrefrence
文件放置到files
目录中在
flutter
应用中:app_flutter
目录放置flutter相关的资源文件
cache
目录用于放置缓存文件由系统管理
code_cache
目录放置flutter
相关的代码以及资源
files
目录放置应用需要使用到的资源文件,比如web
资源等内部存储特点
- 只能由当前应用程序访问相对安全,但是如果设备
Root
之后则具有安全隐患 - 当应用卸载之后会进行删除,不会占用额外的内存,但是也需要考虑数据的生命周期,也不建议直接存储用户数据
- 不用申请权限可以直接使用
- 只能由当前应用程序访问相对安全,但是如果设备
-
外部存储
外部存储主要是指设备的SD卡,是整个设备共享的区域,由于其由安全风险,所以需要申请外部文件读写权限才可使用
IOS的文件存储
每个IOS
程序都有一个独立的文件存储沙盒子区域,并且只能使用这部分进行文件存储,外部无法进行访问,也无法操作外部
path_provider 的使用
如果在运行时提示
don't support null safety:
则需要添加 --no-sound-null-safety
即可忽略此错误
getExternalStorageDirectory
可以获取外部存储,它返回一个Future
对象,他表示未来会返回内容,所以在使用时需要"等等"它
Future
获取并显示外部存储路径
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
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
,一般用来保存一些状态数据,是否打开过引导页,是否注册过指纹等,它是一种key,vakue
的xml
格式的数据,一般用来保存少量的数据,它是将内容保存到了内部存储中也相对安全
添加依赖
shared_preferences: ^0.5.8
数据操作
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");
}
欢迎关注Mike的
Android 知识整理