Я пытаюсь сделать простое приложение, которое рисует на основе ввода пользователя. Делая базовую функциональность, я сталкиваюсь с проблемой, я не могу сохранить изображение. Я искал, и я обнаружил, что я должен использовать PictureRecorder (), но я не мог заставить его работать (моя ошибка не ошибка). Поэтому я хотел бы спросить вас, как мне реализовать PictureRecorder и сохранить изображение на диск с помощью Custom Paint.
Вот код:
import 'package:flutter/services.dart';
import 'dart:ui' as ui;
class Painter extends StatefulWidget {
static String id = 'Painter';
@override
_PainterState createState() => _PainterState();
}
class _PainterState extends State<Painter> {
final recorder = new ui.PictureRecorder();
double canvasWidth = 1200;
double canvasHeight = 1000;
double SecondWidth = 0;
double SecondHeight = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.blueGrey,
appBar: AppBar(
title: Center(
child: Text(
'⚡ ⚡',
style: TextStyle(color: Colors.blue),
),
),
backgroundColor: Colors.black26,
),
body: SafeArea(
child: Container(
padding: EdgeInsets.all(10.0),
child: ListView(
children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text('⚡ ⚡'),
SizedBox(
width: 150.0,
child: TextField(
decoration: InputDecoration(
border: InputBorder.none, hintText: 'title'),
),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text('Canvas Height'),
SizedBox(
width: 150.0,
child: TextField(
onChanged: (value) {
setState(() {
canvasHeight = double.parse(value);
});
},
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'Canvas. Height'),
inputFormatters: [
WhitelistingTextInputFormatter.digitsOnly
],
keyboardType: TextInputType.number,
),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text('Canvas. Width'),
SizedBox(
width: 150.0,
child: TextField(
onChanged: (value) {
setState(() {
canvasWidth = double.parse(value);
});
print(canvasWidth);
},
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'Canvas. Width'),
inputFormatters: [
WhitelistingTextInputFormatter.digitsOnly
],
keyboardType: TextInputType.number,
),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text('Second. height'),
SizedBox(
width: 150.0,
child: TextField(
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'Second. height'),
inputFormatters: [
WhitelistingTextInputFormatter.digitsOnly
],
keyboardType: TextInputType.number,
onChanged: (value) {
setState(() {
SecondHeight = double.parse(value);
});
},
),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text('Secon. width'),
SizedBox(
width: 150.0,
child: TextField(
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'Second. Width'),
inputFormatters: [
WhitelistingTextInputFormatter.digitsOnly
],
keyboardType: TextInputType.number,
onChanged: (value) {
setState(() {
SecondWidth = double.parse(value);
});
},
),
),
],
),
],
),
RaisedButton(
onPressed: () async {
final picture = recorder.endRecording();
final img = picture.toImage(200, 200);
final pngBytes = await img.toByteData(format: new ui.EncodingFormat.png());
},
child: Text('Save Image'),
),
FittedBox(
child: SizedBox(
width: canvasWidth,
height: canvasHeight,
child: Container(
color: Colors.yellow,
child: CustomPaint(
painter: BoxInABox(
canvasrecorder: recorder,
width: canvasWidth,
height: canvasHeight,
iHeight: SecondHeight,
iWidth: SecondWidth,
),
),
),
),
)
],
),
),
),
);
}
}
class BoxInABox extends CustomPainter {
@override
BoxInABox({this.width, this.height, this.iWidth, this.iHeight, this.canvasrecorder});
final double width;
final double height;
final double iWidth;
final double iHeight;
final canvasrecorder;
void paint(Canvas canvas, Size size) {
final paint = Paint()
..style = PaintingStyle.stroke
..strokeWidth = 4.0
..color = Colors.indigo;
canvas.drawRect(
Rect.fromCenter(
height: height,
width: width,
center: Offset(
width / 2,
height / 2,
),
),
Paint()..color = Colors.green);
canvas.drawRect(
Rect.fromCenter(
height: iHeight,
width: iWidth,
center: Offset(
width / 2,
height / 2,
),
),
Paint()..color = Colors.red);
}
@override
bool shouldRepaint(BoxInABox oldDelegate) => true;
}
Заранее спасибо
Редактировать: обновил код, включая мою неудачную попытку реализовать рекордер, Ps выдает ошибку «error:
Метод toByteData» не определен для класса «Future» ». (undefined_method at [flutterappquesion] lib \ main.dart: 152) 'и ошибка: неопределенный класс' ui.EncodingFormat '. (undefined_class в [flutterappquesion] lib \ main.dart: 152)