目次
class _BodyState extends State<Body> {
File _image;
Uint8List _image64;
final picker = ImagePicker();
GlobalKey _globalKey = GlobalKey(); // 1. GlobalKey生成 RepaintBoundary(
key: _globalKey, ←3
child: Stack(
children: [
Positioned(
child: Image.asset(
"assets/images/edit/simple_heart6.png",
height: getProportionateScreenHeight(300),
width: getProportionateScreenWidth(300),
fit: BoxFit.cover,
),
),
Positioned(import 'dart:convert';
import 'dart:typed_data';
import 'dart:ui' as ui;
// ボタンが押された時
void _exportToImage() async {
// 現在描画されているWidgetを取得する
RenderRepaintBoundary boundary =
_globalKey.currentContext.findRenderObject();
// 取得したWidgetからイメージファイルをキャプチャする
ui.Image image = await boundary.toImage(
pixelRatio: 3.0,
);
// 以下はお好みで
// PNG形式化
ByteData byteData = await image.toByteData(
format: ui.ImageByteFormat.png,
);
// バイトデータ化
final _pngBytes = byteData.buffer.asUint8List();
setState(() {
_image64 = _pngBytes;
});
}Uint8List _image64;である必要がある
_image64 == null
? Text("data")
: new Image.memory(
_image64,
height: getProportionateScreenHeight(200),
width: getProportionateScreenWidth(200),
),image_gallery_saver: ^1.6.4import 'package:image_gallery_saver/image_gallery_saver.dart';
// ボタンが押された時
void _exportToImage() async {
// 現在描画されているWidgetを取得する
RenderRepaintBoundary boundary =
_globalKey.currentContext.findRenderObject();
// 取得したWidgetからイメージファイルをキャプチャする
ui.Image image = await boundary.toImage(
pixelRatio: 3.0,
);
// 以下はお好みで
// PNG形式化
ByteData byteData = await image.toByteData(
format: ui.ImageByteFormat.png,
);
// バイトデータ化
final _pngBytes = byteData.buffer.asUint8List();
// BASE64形式化
final _base64 = base64Encode(_pngBytes);
print(_base64);
// ここから
final result = await ImageGallerySaver.saveImage(_pngBytes);
// print(result);
// ここまで追加
setState(() {
_image64 = _pngBytes;
});
}flutter: Another exception was thrown: NoSuchMethodError: The method 'findRenderObject' was called on null.参考
これは、コンテキストがまだ状態に関連付けられていないために発生します。
対応策
GlobalKey _globalKey = GlobalKey(); // 1. GlobalKey生成
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback(_afterLayout);
super.initState();
}
_afterLayout(_) {
_getSizes();
_getPositions();
}
_getSizes() {
final RenderBox renderBoxRed = _globalKey.currentContext.findRenderObject();
final sizeRed = renderBoxRed.size;
print("SIZE of Red: $sizeRed");
}
_getPositions() {
final RenderBox renderBoxRed = _globalKey.currentContext.findRenderObject();
final positionRed = renderBoxRed.localToGlobal(Offset.zero);
print("POSITION of Red: $positionRed ");
}