我可以<Uint8List>在颤振中将未来转换为 Uint8List 吗?



我正在使用flutter制作水印图像,我需要将Future转换为Uint8List。

这是发生问题的代码。

child: Image.memory(putWatermarkOnImage(asset))

孩子是在容器小部件和putWatermarkOnImage函数的结果必须是Uint8List类型,而不是未来的类型。

Future<Uint8List> putWatermarkOnImage(asset) async {
  final assetFile = await asset.file;
  var imageBytes = await assetFile!.readAsBytes();
  ByteData watermarkImgByteData = await rootBundle.load('assets/images/ournow_logo.png');
  Uint8List watermarkImgBytes = watermarkImgByteData.buffer.asUint8List();
  Uint8List imageUint8List = Uint8List.fromList(imageBytes);
  Uint8List watermarkedImg = await ImageWatermark.addImageWatermark(
      originalImageBytes: imageUint8List,
      waterkmarkImageBytes: watermarkImgBytes,
      imgHeight: 200,
      imgWidth: 200,
      dstY: 400,
      dstX: 400);
  return watermarkedImg;
}

我该如何解决这个问题?

我把你的代码和我写的方式来避免混淆,所以我为你创建了一个类来收集所有字节转换相关的方法,并称之为" byteshandler ">

,然后我重新组织代码如下…我相信它会工作请测试一下,告诉我是否有什么问题

import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/services.dart';
import 'package:wechat_camera_picker/wechat_camera_picker.dart';
Future<Uint8List> putWatermarkOnImage(AssetEntity asset) async {
  Uint8List _output;
  if (asset != null){
    final File assetFile = await asset.file;
    final ByteData watermarkImgByteData = await BytesHandlers.getByteDataFromPath('assets/images/ournow_logo.png');
    _output = await BytesHandlers.getUint8ListFromFile(assetFile);
    _output = await ImageWatermark.addImageWatermark(
        originalImageBytes: _output,
        waterkmarkImageBytes: watermarkImgByteData,
        imgHeight: 200,
        imgWidth: 200,
        dstY: 400,
        dstX: 400
    );
  }
  return _output;
}
class BytesHandlers {
  // --------------------
  BytesHandlers();
  // --------------------
  static Future<ByteData> getByteDataFromPath(String assetPath) async {
    /// NOTE : Asset path can be local path or url
    ByteData _byteData;
    if (assetPath != null){
      _byteData = await rootBundle.load(assetPath);
    }
    return _byteData;
  }
  // --------------------
  static Future<Uint8List> getUint8ListFromFile(File file) async {
    Uint8List _uInt;
    if (file != null){
      _uInt = await file.readAsBytes();
    }
    return _uInt;
  }
  // --------------------
}

那么你就可以这样称呼它

final Uint8List _ImageWithWatermark = await putWatermarkOnImage(_inputFile);

最新更新