简体   繁体   English

如何从Dart / Flutter中的抽象类ui,Image创建子类?

[英]How to create subclass from abstract class ui,Image in Dart / Flutter?

I am trying to get an local asset image loaded into an ui.Image object. 我正在尝试将本地资产图像加载到ui.Image对象中。 But the ui.Image is an abstract class. 但是ui.Image是一个抽象类。 I basically have this : 我基本上有这个:

    import 'dart:ui' as ui;
    class MyImage implements ui.Image{

    int height;
    int width;

    MyImage(String file){

    }

    @override
    void dispose() {
    // TODO: implement dispose
    super.dispose();
    }

    @override
    String toString() {
    // TODO: implement toString
    return super.toString();
     }
    }

Using your code with the function definition Below. 将代码与下面的函数定义一起使用。 The error is at ' ui.Image image = await loadImage(img); 错误在'ui.Image image = await loadImage(img); ' await is underlined red and tool tip is 'Undefined name 'await' in function body not marked with async.' 'await用红色下划线标出,工具提示为'函数体中未定义名称'await',未标记异步。'

    class TrialApp extends StatefulWidget {
    @override
    _TrialAppState createState() => new _TrialAppState();
    }

    class _TrialAppState extends State<TrialApp> {

        NodeWithSize rootNode;

    @override
    void initState() {
    // TODO: implement initState
        super.initState();
        rootNode = new NodeWithSize(new Size(400.0, 400.0));
    }

    @override
    Widget build(BuildContext context) {
    // define a function that converts the I.Image object into ui.Image 
    //object
        Future<ui.Image> loadImage(I.Image img) async {
        final Completer<ui.Image> imageCompleter = new Completer();
        ui.decodeImageFromList(img.getBytes(), (ui.Image img) {
          imageCompleter.complete(img);
        });

        return imageCompleter.future;
        }

    // Obtain a `I.Image` object from the image file
    I.Image img = I.decodeImage(new io.File('images/tile.png').readAsBytesSync());

    // Obtain the `ui.Image` from the `I.Image` object
    ui.Image image = await loadImage(img);

   Sprite myButton = new Sprite.fromImage(image);
   rootNode.addChild(myButton);
   return new SpriteWidget(rootNode);
    }
   }

First obtain the image from the assetbundle using rootBundle . 首先使用rootBundle从assetbundle获取图像。 The convert the obtained ByteData to List<int> . 将获得的ByteData转换为List<int> Now you can obtain a ui.Image using the decodeImageFromList method. 现在,你可以得到一个ui.Image使用decodeImageFromList方法。

Example: 例:

// import statements
import 'dart:async';
import 'dart:typed_data';
import 'dart:ui' as ui;

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:spritewidget/spritewidget.dart';

class TrialApp extends StatefulWidget {
  @override
  _TrialAppState createState() => new _TrialAppState();
}

class _TrialAppState extends State<TrialApp> {
  NodeWithSize rootNode = new NodeWithSize(new Size(400.0, 400.0));

  @override
  void initState() {
    super.initState();
    init();
  }

  Future<Null> init() async {
    rootNode = new NodeWithSize(new Size(400.0, 400.0));

    // Read file from assetbundle
    final ByteData data = await rootBundle.load('images/tile.png');

    // Convert the obtained ByteData into ui.Image
    final ui.Image image = await loadImage(new Uint8List.view(data.buffer)); // Uint8List converts the ByteData into List<int>

    Sprite myButton = new Sprite.fromImage(image);
    rootNode.addChild(myButton);

    // notify to redraw with child
    setState(() {
      rootNode = rootNode;
    });
  }

  // define a function that converts the List<int> into ui.Image object
  Future<ui.Image> loadImage(List<int> img) async {
    final Completer<ui.Image> imageCompleter = new Completer();
    ui.decodeImageFromList(img, (ui.Image img) {
      imageCompleter.complete(img);
    });

    return imageCompleter.future;
  }

  @override
  Widget build(BuildContext context) {
    return new Container(
      color: Colors.white,
      child: new SpriteWidget(rootNode),
    );
  }
}

Hope that helps! 希望有帮助!

If you are using SpriteWidget you can load images using the ImageMap class to save some code. 如果使用SpriteWidget,则可以使用ImageMap类加载图像以保存一些代码。 From the SpriteWidget docuementation: 从SpriteWidget文档中:

ImageMap images = new ImageMap(rootBundle);

// Load a single image
ui.Image image = await images.loadImage('assets/my_image.png');

// Load multiple images
await images.load(<String>[
  'assets/image_0.png',
  'assets/image_1.png',
  'assets/image_2.png',
]);

// Access a loaded image from the ImageMap
image = images['assets/image_0.png'];

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM