import 'dart:io'; import 'dart:ui' as ui; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; // Script untuk generate icon PNG dari Flutter widget Future generateIcon() async { WidgetsFlutterBinding.ensureInitialized(); const size = 512; final recorder = ui.PictureRecorder(); final canvas = Canvas(recorder); // Background gradient final backgroundPaint = Paint() ..shader = const LinearGradient( colors: [Color(0xFF1976D2), Color(0xFF2196F3)], begin: Alignment.topLeft, end: Alignment.bottomRight, ).createShader(Rect.fromLTWH(0, 0, size.toDouble(), size.toDouble())); // Draw rounded background canvas.drawRRect( RRect.fromLTRBR( 0, 0, size.toDouble(), size.toDouble(), const Radius.circular(80), ), backgroundPaint, ); // White paint for elements final whitePaint = Paint() ..color = Colors.white ..style = PaintingStyle.fill; final linePaint = Paint() ..color = Colors.white ..strokeWidth = 8 ..strokeCap = StrokeCap.round; // Draw API connection lines // Left side canvas.drawLine(const Offset(80, 200), const Offset(180, 200), linePaint); canvas.drawLine(const Offset(80, 256), const Offset(180, 256), linePaint); canvas.drawLine(const Offset(80, 312), const Offset(180, 312), linePaint); // Right side canvas.drawLine(const Offset(332, 200), const Offset(432, 200), linePaint); canvas.drawLine(const Offset(332, 256), const Offset(432, 256), linePaint); canvas.drawLine(const Offset(332, 312), const Offset(432, 312), linePaint); // Central connections canvas.drawLine(const Offset(200, 200), const Offset(220, 200), linePaint); canvas.drawLine(const Offset(200, 256), const Offset(220, 256), linePaint); canvas.drawLine(const Offset(200, 312), const Offset(220, 312), linePaint); canvas.drawLine(const Offset(292, 200), const Offset(312, 200), linePaint); canvas.drawLine(const Offset(292, 256), const Offset(312, 256), linePaint); canvas.drawLine(const Offset(292, 312), const Offset(312, 312), linePaint); // Draw API nodes (circles) canvas.drawCircle(const Offset(60, 200), 20, whitePaint); canvas.drawCircle(const Offset(60, 256), 20, whitePaint); canvas.drawCircle(const Offset(60, 312), 20, whitePaint); canvas.drawCircle(const Offset(452, 200), 20, whitePaint); canvas.drawCircle(const Offset(452, 256), 20, whitePaint); canvas.drawCircle(const Offset(452, 312), 20, whitePaint); // Central processing unit canvas.drawRRect( RRect.fromLTRBR(220, 180, 292, 312, const Radius.circular(12)), whitePaint, ); // Fire detection symbol final firePaint = Paint() ..shader = const LinearGradient( colors: [Color(0xFFFF5722), Color(0xFFF44336)], begin: Alignment.topLeft, end: Alignment.bottomRight, ).createShader(const Rect.fromLTWH(240, 190, 32, 60)); // Simple fire shape final firePath = Path() ..moveTo(256, 190) ..quadraticBezierTo(240, 200, 245, 220) ..quadraticBezierTo(250, 235, 256, 240) ..quadraticBezierTo(262, 235, 267, 220) ..quadraticBezierTo(272, 200, 256, 190); canvas.drawPath(firePath, firePaint); // Status indicator final statusPaint = Paint()..color = const Color(0xFF4CAF50); canvas.drawCircle(const Offset(400, 112), 24, statusPaint); // Check mark final checkPaint = Paint() ..color = Colors.white ..strokeWidth = 4 ..strokeCap = StrokeCap.round ..style = PaintingStyle.stroke; final checkPath = Path() ..moveTo(388, 112) ..lineTo(396, 120) ..lineTo(412, 104); canvas.drawPath(checkPath, checkPaint); // Create image final picture = recorder.endRecording(); final image = await picture.toImage(size, size); final byteData = await image.toByteData(format: ui.ImageByteFormat.png); if (byteData != null) { final file = File('assets/icons/app_icon.png'); await file.writeAsBytes(byteData.buffer.asUint8List()); print('Icon generated successfully: ${file.path}'); } } void main() async { await generateIcon(); }