Flutter 存储
2021-01-05 本文已影响0人
苦咖啡Li
1、本地存储
1.1 在 pubspec.yaml
包文件中添加包文件名,并通过 flutter package get
下载包依赖
shared_preferences: ^0.5.8
1.2 在需要使用的组件中引入包依赖文件
import 'package:shared_preferences/shared_preferences.dart';
1.3 在组件中使用
final sp = await SharedPreferences.getInstance();
// 往本地存储中存数据
sp.setBool('flag', true);
sp.setDouble('double', 2020.08);
sp.setInt('int', 2020);
sp.setString('Sting', 'hello 小明');
sp.setStringList('stringList', ['1','2','3']);
// 从本地存储中取数据
final flag= sp.get('flag'); // 获取对应key值得数据
final stringList = sp.getStringList('stringList');
print('本地缓存中数据: $stringList');
1.4 本地存储封装
// 公共文件utils中封装本地存储的方法
class LocalSave{
// 读取数据
static getSp(String keyName) async{
SharedPreferences sp = await SharedPreferences.getInstance();
String data = sp.get(keyName);
return data;
}
// 保存数据
static saveSp(String keyName,String value) async{
SharedPreferences sp = await SharedPreferences.getInstance();
bool isOK = await sp.setString(keyName, value);
return isOK;
}
}
// 组件中引入本地存储 + 调用
LocalSave.saveSp('stringList', json.encode(['1','2','3']));
final getspData = await LocalSave.getSp('stringList');
print(getspData);
2、 文件存储
Flutter SDK
本身已经有 File 相关的 api ,在 Flutter 中使用 file 存储的关键是获取手机中存储的目录,然后根据目录路径来创建不同的文件。根据 Flutter
的特性,我们可以自定义 channel
来获取平台端的可存储文件夹路径给 flutter
端,我们需要用到插件 path_provider
。
path_provider 插件提供了三个方法:
getTemporaryDirectory() // 获取临时目录
getApplicationDocumentsDirectory() // 获取应用文档目录
getExternalStorageDirectory() // 获取外部存储目录,该方法仅支持安卓,IOS 平台会抛出不支持的错误信息,因此可看出IOS平台没有外部存储目录的概念,所以无法获取外部存储目录路径
2.1 在 pubspec.yaml
包文件中添加包文件名,并通过 flutter package get
下载包依赖
path_provider: ^1.6.11
2.2 在需要使用的组件中引入包依赖文件
import 'package:path_provider/path_provider.dart';
2.3 在组件中使用
/*
* @Description: 定义文件存储中相关操作方法
*/
// 找到正确的本地路径
// iOS模拟器中file的路径为: /Users/.../CoreSimulator/Devices/D44E9E54-2FDD-40B2-A953-3592C1D0BFD8/data/Containers/Data/Application/28644C62-1FFA-422E-8ED6-54AA4E9CBE0C/Documents
// Android模拟器中file的路径为: /data/user/0/com.example.demo/app_flutter
Future<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
// 创建对文件位置的引用
Future<File> get _localFile async {
final path = await _localPath;
return new File('$path/counter.txt');
}
// 将数据写入文件
Future<File> writeCounter(counter) async {
final file = await _localFile;
return file.writeAsString('$counter');
}
// 从文件中读取数据
Future<String> readCounter() async {
try {
final file = await _localFile;
String contents = await file.readAsString();
return contents;
} catch (e) {
//读取错误时返回信息
return 'error';
}
}
/*
* @Description: 组件中调用文件的方法
*/
// 获取本地路径
_localPath.then((value) => {
print('获取本地路径: $value')
});
// 创建对文件位置的引用
_localFile.then((value) => {
print('创建对文件位置的引用: $value')
});
// 将数据写入文件
final writeData = await writeCounter('测试文件存储');
print('写入数据: $writeData');
// 从文件中读取数据
final readData = await readCounter();
print('读取数据: $readData');
3、 网络图片资源本地缓存
3.1 在 pubspec.yaml
包文件中添加包文件名,并通过 flutter package get
下载包依赖
cached_network_image: ^2.2.0+1
3.2 在需要使用的组件中引入包依赖文件
import 'package:cached_network_image/cached_network_image.dart';
3.3 组件中使用
CachedNetworkImage(
imageUrl: "https://tpc.googlesyndication.com/simgad/7275932481044045584?sqp=4sqPyQQ7QjkqNxABHQAAtEIgASgBMAk4A0DwkwlYAWBfcAKAAQGIAQGdAQAAgD-oAQGwAYCt4gS4AV_FAS2ynT4&rs=AOga4qlT010JqD6sByFyXwBOCmZFFnlE6g",
width: 600,
)
注意: 只有需要访问的图片地址存在、有效、有权限、网络正常的情况下才可以访问成功,网络上随便找的图片可能会存在 ( 404:图片不存在; 403: 无权限访问; 无效图片资源; 网络不通... 等)错误信息