Widget to Image Converter
Flutter FFI plugin for converting widgets to JPEG and PNG images using native C code.
Features
- Convert Flutter widgets to JPEG and PNG images
- Automatic conversion state management
- JPEG quality configuration (1-100)
- Cross-platform support (iOS, Android, macOS)
Installation
Add to your pubspec.yaml
:
dependencies:
widget_to_image_converter: ^1.0.0
path_provider: ^2.0.0
Usage
Basic Example
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:widget_to_image_converter/widget_to_image_converter.dart';
import 'package:path_provider/path_provider.dart';
void main() {
runApp(const MaterialApp(home: MyApp()));
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return WidgetToImageProvider(
child: Scaffold(
body: Column(
children: [
// Wrap widget to convert
WidgetToImageWrapper(
child: Container(
width: 300,
height: 200,
decoration: BoxDecoration(
gradient: LinearGradient(colors: [Colors.blue, Colors.purple]),
borderRadius: BorderRadius.circular(20),
),
child: const Center(
child: Text('Widget to convert', style: TextStyle(color: Colors.white)),
),
),
),
const SizedBox(height: 20),
const SomeButton(),
],
),
),
);
}
}
class SomeButton extends StatelessWidget {
const SomeButton({super.key});
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () async {
final controller = WidgetToImageProvider.of(context, listen: false);
final tempDir = await getTemporaryDirectory();
final path = '${tempDir.path}/widget.jpg';
await controller.saveAsJpeg(outputPath: path, quality: 90);
},
child: const Text('Save as JPEG'),
);
}
}
Advanced Usage
class AdvancedExample extends StatefulWidget {
const AdvancedExample({super.key});
@override
_AdvancedExampleState createState() => _AdvancedExampleState();
}
class _AdvancedExampleState extends State<AdvancedExample> {
late final WidgetToImageController _controller;
@override
void initState() {
super.initState();
_controller = WidgetToImageController();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
Future<void> _saveHighQuality() async {
final tempDir = await getTemporaryDirectory();
final path = '${tempDir.path}/high_quality.jpg';
await _controller.saveAsJpeg(
outputPath: path,
quality: 95,
pixelRatio: 2.0,
);
}
@override
Widget build(BuildContext context) {
return WidgetToImageProvider(
controller: _controller,
child: Scaffold(
body: Column(
children: [
WidgetToImageWrapper(child: YourWidget()),
ElevatedButton(
onPressed: _saveHighQuality,
child: const Text('Save High Quality'),
),
],
),
),
);
}
}
API Reference
WidgetToImageProvider
Wrapper for providing controller to widgets.
WidgetToImageController
saveAsJpeg({required String outputPath, double? pixelRatio, int quality = 90})
saveAsPng({required String outputPath, double? pixelRatio})
saveAsRgbaFile({required String outputPath, double? pixelRatio})
WidgetToImageWrapper
Wrapper widget for automatic RepaintBoundary creation.
Requirements
- Dart 3.0.0+
- Flutter 3.0.0+
License
MIT License