Преглед на файлове

1、签名base64图片改成url地址

guanxinyi преди 1 година
родител
ревизия
4ec4e15890

+ 32 - 3
lib/pages/contract/signature_board/view.dart

@@ -1,9 +1,14 @@
 import 'dart:convert';
+import 'dart:io';
 
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
+import 'package:image_picker/image_picker.dart';
+import 'package:uuid/uuid.dart';
+import 'package:vnoteapp/architecture/storage/storage.dart';
 import 'package:vnoteapp/components/appbar.dart';
 import 'package:fis_common/logger/logger.dart';
+import 'package:vnoteapp/rpc.dart';
 import 'dart:ui' as ui;
 
 import 'controller.dart';
@@ -113,8 +118,8 @@ class SignatureBoardPage extends GetView<SignatureBoardController> {
               ),
             ),
             onPressed: () async {
-              final result = await canvasController.getImageBase64();
-              Get.back(result: "data:image/png;base64,$result");
+              final result = await canvasController.getImageUrl();
+              Get.back(result: result);
             },
             child: const Text(
               "保存",
@@ -153,6 +158,30 @@ class _SignatureBoardController extends ChangeNotifier {
     notifyListeners();
   }
 
+  XFile? convertBase64ToXFile(String base64Image) {
+    try {
+      final bytes = base64Decode(base64Image);
+      final tempDir = Directory.systemTemp;
+      final tempPath = tempDir.path;
+      final imageId = const Uuid().v4().replaceAll('-', '');
+
+      final filePath = '$tempPath/$imageId';
+
+      File(filePath).writeAsBytesSync(bytes);
+      return XFile(filePath);
+    } catch (e) {
+      print('Error converting base64 to XFile: $e');
+      return null;
+    }
+  }
+
+  Future<String?> getImageUrl() async {
+    final imageBase64 = await getImageBase64();
+    final xFile = convertBase64ToXFile(imageBase64!);
+    String? url = await rpc.storage.upload(xFile!);
+    return url;
+  }
+
   /// 获取图片base64字符串
   Future<String?> getImageBase64() async {
     try {
@@ -192,7 +221,7 @@ class _SignatureBoardController extends ChangeNotifier {
 class _SignatureBoard extends StatefulWidget {
   final _SignatureBoardController controller;
 
-  const _SignatureBoard({super.key, required this.controller});
+  const _SignatureBoard({required this.controller});
   @override
   _SignatureBoardState createState() => _SignatureBoardState();
 }

+ 1 - 3
lib/pages/doctor/signature_setting/controller.dart

@@ -32,8 +32,6 @@ class DoctorSignatureSettingController extends GetxController {
   }
 
   void _updateSignature(String value) {
-    if (value.startsWith('data:image')) {
-      state.signaturBase64 = value.split(',')[1];
-    }
+    state.signaturUrl = value;
   }
 }

+ 3 - 3
lib/pages/doctor/signature_setting/state.dart

@@ -2,9 +2,9 @@ import 'package:get/get.dart';
 import 'package:vnoteapp/architecture/defines.dart';
 
 class DoctorSignatureSettingState {
-  final RxnString _signaturBase64 = RxnString(null);
+  final RxnString _signaturUrl = RxnString(null);
 
   /// 签名Base64
-  String? get signaturBase64 => _signaturBase64.value;
-  set signaturBase64(String? value) => _signaturBase64.updateValue(value);
+  String? get signaturUrl => _signaturUrl.value;
+  set signaturUrl(String? value) => _signaturUrl.updateValue(value);
 }

+ 6 - 9
lib/pages/doctor/signature_setting/view.dart

@@ -1,5 +1,3 @@
-import 'dart:convert';
-
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
 import 'package:vnoteapp/components/button.dart';
@@ -31,8 +29,8 @@ class DoctorSignatureSettingPage
 
   Widget _buildPreview() {
     return Obx(() {
-      final imageWidget = controller.state.signaturBase64 != null
-          ? _buildBase64Preview()
+      final imageWidget = controller.state.signaturUrl != null
+          ? _buildImagePreview()
           : _buildEmptyPreview();
       return Container(
         decoration: BoxDecoration(
@@ -46,11 +44,10 @@ class DoctorSignatureSettingPage
     });
   }
 
-  Widget _buildBase64Preview() {
-    final base64 = controller.state.signaturBase64!;
-    final bytes = base64Decode(base64);
-    return Image.memory(
-      bytes,
+  Widget _buildImagePreview() {
+    final signaturUrl = controller.state.signaturUrl!;
+    return Image.network(
+      signaturUrl,
       fit: BoxFit.contain,
     );
   }

+ 1 - 3
lib/pages/home/personal_center/controller.dart

@@ -38,9 +38,7 @@ class PersonalCenterController extends FControllerBase {
   }
 
   void _updateSignature(String value) {
-    if (value.startsWith('data:image')) {
-      state.signaturBase64 = value.split(',')[1];
-    }
+    state.signaturUrl = value;
   }
 
   Future<bool> updateUserInfo() async {

+ 3 - 3
lib/pages/home/personal_center/state.dart

@@ -12,7 +12,7 @@ class PersonalCenterState {
   final Rx<String> _confirmPassword = Rx('');
   final Rx<String> _name = Rx('');
   final Rx<String> _phone = Rx('');
-  final RxnString _signaturBase64 = RxnString(null);
+  final RxnString _signaturUrl = RxnString(null);
   final RxnString _headImageToken = RxnString(null);
   UserDTO get dto => _dto.value;
 
@@ -53,6 +53,6 @@ class PersonalCenterState {
   }
 
   /// 签名Base64
-  String? get signaturBase64 => _signaturBase64.value;
-  set signaturBase64(String? value) => _signaturBase64.updateValue(value);
+  String? get signaturUrl => _signaturUrl.value;
+  set signaturUrl(String? value) => _signaturUrl.updateValue(value);
 }

+ 4 - 7
lib/pages/home/personal_center/widgets/signature.dart

@@ -1,5 +1,3 @@
-import 'dart:convert';
-
 import 'package:get/get.dart';
 import 'package:flutter/material.dart';
 import 'package:vnoteapp/components/button.dart';
@@ -29,7 +27,7 @@ class SignaturePage extends GetView<PersonalCenterController> {
 
   Widget _buildPreview() {
     return Obx(() {
-      final imageWidget = controller.state.signaturBase64 != null
+      final imageWidget = controller.state.signaturUrl != null
           ? _buildBase64Preview()
           : _buildEmptyPreview();
       return Container(
@@ -45,10 +43,9 @@ class SignaturePage extends GetView<PersonalCenterController> {
   }
 
   Widget _buildBase64Preview() {
-    final base64 = controller.state.signaturBase64!;
-    final bytes = base64Decode(base64);
-    return Image.memory(
-      bytes,
+    final url = controller.state.signaturUrl!;
+    return Image.network(
+      url,
       fit: BoxFit.contain,
     );
   }