如何在flutter中使用rootBundle加载图片?

Nic*_*ick 8 image dart flutter

我使用图像插件(图像:^2.0.4)所以我可以在图像上写一些东西,然后将新图像保存到设备或通过邮件发送。我尝试使用“新文件”加载图像,但在 Flutter 上出错。我询问并搜索并得到提示,我可以使用 rootBundle 在 Flutter 中加载图像。我做了,我得到了以下错误。

[ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] 未处理的异常:无法加载资产:packages/myAppName/assets/images/ReceiptRaw_1.jpg

当我创建一个简单的 dart 控制台应用程序时,该插件可以工作,但无法使用 flutter 加载。请任何帮助,

这是颤振代码:

    Future<bool> makeReceiptImage() async {

// UPDATE ****************************************

      // load the receipt jpeg
  var imageData = await rootBundle.load('packages/myAppName/dekonts/ReceiptRaw_1.jpg');
  print("imageData: $imageData"); // Prints as imageData: Instance of 
'_ByteDataView'

// UPDATE ****************************************

  Image _receiptImage = await decodeImage(new File(imageData).readAsBytesSync());

      drawString(_receiptImage, arial_48, 440, 30, “Customer Name”, color: 0xFF000000); 

      // Write it to disk as a different jpeg 
      var new_jpeg = await encodeJpg(_receiptImage); 
      String newImagePath = await rootBundle.loadString('packages/myAppName/assets/images/ReceiptRaw_2.jpg'); 
      await new File(‘$newImagePath’).writeAsBytesSync(new_jpeg); 
    }
Run Code Online (Sandbox Code Playgroud)

这是 Dart 控制台代码:

import 'dart:io';
import 'dart:convert';
import 'dart:async';
import 'package:image/image.dart';

void main() async {
  // load the receipt jpeg
  String mImagePath = 'images/ReceiptRaw_1.jpg';
  Image _receiptImage = decodeImage(new File(mImagePath).readAsBytesSync());
  drawString(_receiptImage, arial_48, 440, 30, “Customer Name”, color: 0xFF000000);

  // Write it to disk as a different jpeg
  var new_jpeg = encodeJpg(_receiptImage);
  new File('images/ReceiptRaw_1.jpg').writeAsBytesSync(new_jpeg);
}
Run Code Online (Sandbox Code Playgroud)

更新 1: 当我使用下面的代码时,我收到错误消息:

在 pubspec.yaml 中检测到错误:未 找到资产的文件或变体:packages/myAppName/assets/images/ReceiptRaw_1.jpg

 String imageData = await rootBundle.loadString('packages/myAppName/assets/images/ReceiptRaw_1.jpg');
  Image _receiptImage = await decodeImage(new File(imageData).readAsBytesSync());
Run Code Online (Sandbox Code Playgroud)

更新 2: 如果我使用rootBundle.load我得到以下错误。

错误:“dart.typed_data::ByteData”类型的值不能分配给“dart.core::String”类型的变量。

var imageData = await rootBundle.load('packages/myAppName/assets/images/ReceiptRaw_1.jpg');
  Image _receiptImage = await decodeImage(new File(imageData).readAsBytesSync());
Run Code Online (Sandbox Code Playgroud)

新更新:

步骤1: 移动到ReceiptRaw_1.jpglib/dekonts/

改成:

assets:
  - packages/myAppName/dekonts/ReceiptRaw_1.jpg
Run Code Online (Sandbox Code Playgroud)

改成:

var imageData = await rootBundle.load('packages/myAppName/dekonts/ReceiptRaw_1.jpg');
print("imageData: $imageData"); 
Run Code Online (Sandbox Code Playgroud)

结果:打印为

imageData:'_ByteDataView' 的实例

第 2 步: 移动到 /lib/assets/images/ReceiptRaw_1.jpg文件夹

改成:

assets:
  - packages/myAppName/lib/assets/images/ReceiptRaw_1.jpg
Run Code Online (Sandbox Code Playgroud)

改成:

var imageData = await rootBundle.load('packages/myAppName/lib/assets/images/ReceiptRaw_1.jpg');
print("imageData: $imageData"); 
Run Code Online (Sandbox Code Playgroud)

结果: 得到错误为:

正在解析依赖项...正在运行 'gradlew assembleDebug'... 在 pubspec.yaml 中检测到错误:未找到资产的文件或变体:packages/myAppName/lib/assets/images/ReceiptRaw_1.jpg

更新:

/// 要包含,比如说第一张图片,pubspec.yaml应用程序应该
/// 在资产部分指定它:
///
/// assets: /// - packages/fancy_backgrounds/backgrounds/background1.png ///
///lib/是隐含的,因此不应包含在资产路径中。

Gün*_*uer 10

pub 依赖项的文件不能作为文件使用。它们包含在存档文件中。

将图像添加到资产中 pubspec.yaml

flutter:
  assets:
    - packages/myAppName/assets/images/ReceiptRaw_1.jpg
Run Code Online (Sandbox Code Playgroud)

然后加载它

var imageData = await rootBundle.load('packages/myAppName/assets/images/ReceiptRaw_1.jpg');
Run Code Online (Sandbox Code Playgroud)

为此,文件ReceiptRaw_1.jpg需要在

myAppName/lib/assets/images/ReceiptRaw_1.jpg
Run Code Online (Sandbox Code Playgroud)

lib/部分是强制性的。