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: 无权限访问; 无效图片资源; 网络不通... 等)错误信息

上一篇下一篇

猜你喜欢

热点阅读