在 Flutter 的磁盘上本地存储带有图像的对象的最佳方法?

如何解决在 Flutter 的磁盘上本地存储带有图像的对象的最佳方法?

我正在为一个人制作一个超级简单的食谱(就像字面上的食物)应用程序,所以我没有想过我想要/需要使用数据库或任何互联网连接。当用户创建一个菜谱时,菜谱对象包含一堆字符串和一个图像,如下所示:

class Recipe {
 String _title;
  Image _picture;
  Uint8List _imageBytes;
  int _prepTime;
  int _cookTime;
  int _totalTime;
  String _description;
  List<String> _ingredientList;
  List<String> _directionsList;


....
}


用户可能会创建大约 20 个食谱。不需要任何配置文件,因为我实际上只是为一个人制作应用程序。食谱是唯一需要保留的应用数据。

到目前为止,我已尝试将每个配方编码为 JSON,然后将其保存到 shared_preferences(注意我试图用于此目的的 _imageBytes 字段)。但这不仅看起来是一种非常低效的做事方式,我什至无法让它发挥作用。获得这方面的信息似乎非常困难:人们通常如何在 Flutter 应用程序中本地存储此类信息,而不使用数据库?还是数据库是通往这里的方式?

解决方法

使用本地数据库(例如 SQLite)在 Flutter 中有效地持久化数据是一种可行的方法:

  1. 导入正确的依赖项:
import 'dart:async';

import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
  1. 打开数据库:
WidgetsFlutterBinding.ensureInitialized();
// Open the database and store the reference.
final Future<Database> database = openDatabase(
  join(await getDatabasesPath(),'recipes_database.db'),);
  1. 创建表:
final Future<Database> database = openDatabase(
  join(await getDatabasesPath(),'doggie_database.db'),onCreate: (db,version) {
    return db.execute(
      "CREATE TABLE dogs(id INTEGER PRIMARY KEY,name TITLE)",// all the properties here
    );
  },version: 1,);
  1. 创建插入和检索条目的方法:
Future<void> inserRecipe(Recipe recipe) async {
  final Database db = await database;
  await db.insert(
    'recipe',recipe.toMap(),conflictAlgorithm: ConflictAlgorithm.replace,);
}
Future<List<Recipe>> recipes() async {
  final Database db = await database;

  final List<Map<String,dynamic>> maps = await db.query('recipes');

  return List.generate(maps.length,(i) {
    return Recipe(
      title: maps[i]['title'],// ... all the properties here
    );
  });
}

由于我们的类 Recipe 包含文件,更具体地说是图像,我们可以将 Image 存储为 URL 并利用 Cache 来检索它:

var image = await DefaultCacheManager().getSingleFile(recipe.picture);
,

你需要路径提供程序包和flutter缓存管理器。

以下示例展示了如何使用缓存管理器存储网络图像。

import 'dart:async';
import 'dart:io' as Io;
import 'package:image/image.dart';

import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:path_provider/path_provider.dart';
class SaveFile {

  Future<String> get _localPath async {
    final directory = await getApplicationDocumentsDirectory();

    return directory.path;
  }
  Future<Io.File> getImageFromNetwork(String url) async {

    var cacheManager = await CacheManager.getInstance();
    Io.File file = await cacheManager.getFile(url);
    return file;
  }

  Future<Io.File> saveImage(String url) async {

    final file = await getImageFromNetwork(url);
    //retrieve local path for device
    var path = await _localPath;
    Image image = decodeImage(file.readAsBytesSync());

    Image thumbnail = copyResize(image,120);

    // Save the thumbnail as a PNG.
    return new Io.File('$path/${DateTime.now().toUtc().toIso8601String()}.png')
      ..writeAsBytesSync(encodePng(thumbnail));
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?