import 'package:dio/dio.dart'; import 'package:example/exif/customer_exif_Page.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:image_editor_plus/image_editor_plus.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( // This is the theme of your application. // // TRY THIS: Try running your application with "flutter run". You'll see // the application has a purple toolbar. Then, without quitting the app, // try changing the seedColor in the colorScheme below to Colors.green // and then invoke "hot reload" (save your changes or press the "hot // reload" button in a Flutter-supported IDE, or press "r" if you used // the command line to start the app). // // Notice that the counter didn't reset back to zero; the application // state is not lost during the reload. To reset the state, use hot // restart instead. // // This works for code too, not just values: Most code changes can be // tested with just a hot reload. colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), // home: const MyHomePage(title: 'Flutter Demo Home Page'), home: CustomerExifPage(), ); } } /// Dio 最简版:网络图片转 Uint8List Future networkImageToUint8ListWithDio(String imageUrl) async { final dio = Dio(); // 初始化 Dio 实例 try { // 发起 GET 请求,响应类型设为字节数组(关键) final response = await dio.get>( imageUrl, options: Options(responseType: ResponseType.bytes), ); // 响应成功且数据非空时,直接转为 Uint8List return response.statusCode == 200 && response.data != null ? Uint8List.fromList(response.data!) : null; } catch (e) { print('图片转换失败:$e'); // 捕获网络错误、URL 非法等异常 return null; } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); // This widget is the home page of your application. It is stateful, meaning // that it has a State object (defined below) that contains fields that affect // how it looks. // This class is the configuration for the state. It holds the values (in this // case the title) provided by the parent (in this case the App widget) and // used by the build method of the State. Fields in a Widget subclass are // always marked "final". final String title; @override State createState() => _MyHomePageState(); } class _MyHomePageState extends State { final int _counter = 0; Future _incrementCounter()async { String imageUrl = 'https://static.cop.jingheyijia.com/wxapp-map2/upload/moment/20251029/app-bpItvFOQufCL.jpg'; Uint8List? imageBytes = await networkImageToUint8ListWithDio(imageUrl); ImageEditor.setI18n({ 'crop': '裁剪', 'rotate left': '左旋转', 'rotate right': '右旋转', 'flip': '水平翻转', 'brush': '涂抹', 'link':'链接', 'save': '保存', 'text': '文本', 'blur': '模糊', 'filter': '滤镜', 'size': '大小', 'color': '颜色', 'background color': '背景颜色', 'background opacity': '背景透明度', 'reset': '重置', 'freeform': '自由裁剪', 'remove': '移除', 'emoji': '表情', 'slider color': '滑块颜色', 'color opacity': '透明度', 'blur radius': '模糊半径', }); if(mounted){ final editedImage = await Navigator.push( context, MaterialPageRoute( builder: (context) => ImageEditor( image: imageBytes, blurOption: null, filtersOption: null, brushOption: null, textOption: null, emojiOption: null, ), ), ); print(editedImage); } } @override Widget build(BuildContext context) { // This method is rerun every time setState is called, for instance as done // by the _incrementCounter method above. // // The Flutter framework has been optimized to make rerunning build methods // fast, so that you can just rebuild anything that needs updating rather // than having to individually change instances of widgets. return Scaffold( appBar: AppBar( // TRY THIS: Try changing the color here to a specific color (to // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar // change color while the other colors stay the same. backgroundColor: Theme.of(context).colorScheme.inversePrimary, // Here we take the value from the MyHomePage object that was created by // the App.build method, and use it to set our appbar title. title: Text(widget.title), ), body: Center( // Center is a layout widget. It takes a single child and positions it // in the middle of the parent. child: Column( // Column is also a layout widget. It takes a list of children and // arranges them vertically. By default, it sizes itself to fit its // children horizontally, and tries to be as tall as its parent. // // Column has various properties to control how it sizes itself and // how it positions its children. Here we use mainAxisAlignment to // center the children vertically; the main axis here is the vertical // axis because Columns are vertical (the cross axis would be // horizontal). // // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" // action in the IDE, or press "p" in the console), to see the // wireframe for each widget. mainAxisAlignment: MainAxisAlignment.center, children: [ const Text( 'You have pushed the button this many times:', ), Text( '$_counter', style: Theme.of(context).textTheme.headlineMedium, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: const Icon(Icons.add), ), // This trailing comma makes auto-formatting nicer for build methods. ); } }