[英]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.