Browse Source

[new]调整导入音频文件流程

zk 1 năm trước cách đây
mục cha
commit
4c96c21108

+ 11 - 2
lib/data/repositories/talk_repository.dart

@@ -132,10 +132,10 @@ class TalkRepository {
   }
 
   Future<TalkBean> talkCreate(String requestId, int duration,
-      {String? localAudioUrl, int? uploadType}) {
+      {String? localAudioUrl, FileUploadType? uploadType}) {
     return atmobApi
         .talkCreate(TalkCreateRequest(duration, requestId,
-            localAudioUrl: localAudioUrl, uploadType: uploadType))
+            localAudioUrl: localAudioUrl, uploadType: uploadType?.value))
         .then(HttpHandler.handle(true))
         .then((bean) {
       //添加新的录音到最新记录
@@ -208,4 +208,13 @@ void setUploadCallback() {
   FlutterForegroundTask.setTaskHandler(UploadTaskHandler());
 }
 
+enum FileUploadType {
+  record(0),
+  local(1);
+
+  final int value;
+
+  const FileUploadType(this.value);
+}
+
 final talkRepository = TalkRepository._();

+ 6 - 6
lib/module/audiopicker/controller.dart

@@ -1,7 +1,7 @@
 import 'dart:io';
 
 import 'package:electronic_assistant/base/base_controller.dart';
-import 'package:electronic_assistant/handler/audio_picker_handler.dart';
+import 'package:electronic_assistant/utils/audio_picker_utils.dart';
 import 'package:electronic_assistant/utils/toast_util.dart';
 import 'package:get/get.dart';
 import 'package:photo_manager/photo_manager.dart';
@@ -18,8 +18,8 @@ class AudioPickerController extends BaseController {
   @override
   void onReady() async {
     super.onReady();
-    if (!await AudioPickerHandler.hasPermission()) {
-      bool permission = await AudioPickerHandler.requestPermissionExtend();
+    if (!await AudioPickerUtils.hasPermission()) {
+      bool permission = await AudioPickerUtils.requestPermissionExtend();
       if (!permission) {
         ToastUtil.showToast('授权失败');
         return;
@@ -33,14 +33,14 @@ class AudioPickerController extends BaseController {
     if (currentPath == null) {
       return;
     }
-    AudioPickerHandler.getAssetList(currentPath!, 0).then((value) {
+    AudioPickerUtils.getAssetList(currentPath!, 0).then((value) {
       audioList.addAll(value);
     });
   }
 
   Future<AssetPathEntity?> initPathEntity() async {
     List<AssetPathEntity> listEntity =
-        await AudioPickerHandler.getAssetPathList();
+        await AudioPickerUtils.getAssetPathList();
     if (listEntity.isEmpty) {
       return null;
     }
@@ -57,7 +57,7 @@ class AudioPickerController extends BaseController {
     try {
       TalkBean bean = await talkRepository.talkCreate(
           const Uuid().v4(), entity.duration,
-          localAudioUrl: entity.id, uploadType: 1);
+          localAudioUrl: entity.id, uploadType: FileUploadType.local);
       Get.back();
       TalkPage.start(bean);
     } catch (e) {

+ 3 - 0
lib/module/audiopicker/view.dart

@@ -1,8 +1,10 @@
 import 'package:electronic_assistant/base/base_page.dart';
 import 'package:electronic_assistant/data/bean/store_item.dart';
+import 'package:electronic_assistant/dialog/add_agenda_dialog.dart';
 import 'package:electronic_assistant/utils/expand.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart';
 import 'package:photo_manager/photo_manager.dart';
 
@@ -14,6 +16,7 @@ class AudioPickerPage extends BasePage<AudioPickerController> {
   @override
   Widget buildBody(BuildContext context) {
     return Container(
+      height: ScreenUtil().screenHeight - 70.h,
       child: Column(
         children: [
           Text('AudioPickerPage'),

+ 18 - 96
lib/module/home/controller.dart

@@ -13,19 +13,17 @@ import 'package:electronic_assistant/module/talk/view.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
 import 'package:electronic_assistant/router/app_pages.dart';
 import 'package:electronic_assistant/utils/event_bus.dart';
+import 'package:electronic_assistant/utils/file_upload_check_helper.dart';
 import 'package:electronic_assistant/widget/pull_to_refresh.dart';
-import 'package:file_picker/file_picker.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
-import 'package:just_audio/just_audio.dart';
-import 'package:uuid/uuid.dart';
 import '../../data/api/response/example_info_response.dart';
 import '../../data/bean/agenda.dart';
 import '../../data/repositories/account_repository.dart';
-import '../../dialog/loading_dialog.dart';
+import '../../resource/colors.gen.dart';
 import '../../utils/error_handler.dart';
 import '../../utils/toast_util.dart';
-import 'package:path_provider/path_provider.dart';
+import '../audiopicker/view.dart';
 
 class HomePageController extends BaseController {
   get isLogin => accountRepository.isLogin.value;
@@ -122,83 +120,17 @@ class HomePageController extends BaseController {
   }
 
   void onPickerAudioFile() async {
-    Get.toNamed(RoutePath.audioPicker);
-
-    // EventHandler.report(EventId.event_100030);
-    // if (!accountRepository.isLogin.value) {
-    //   Get.toNamed(RoutePath.login);
-    //   ToastUtil.showToast(StringName.errorCodeNoLogin.tr);
-    //   return;
-    // }
-    //
-    // FilePickerResult? result = await FilePicker.platform
-    //     .pickFiles(type: FileType.custom, allowedExtensions: [
-    //   'wav',
-    //   'mp3',
-    //   'm4a',
-    //   'flv',
-    //   'mp4',
-    //   'wma',
-    //   '3gp',
-    //   'amr',
-    //   'aac',
-    //   'ogg-opus',
-    //   'flac'
-    // ]);
-    // if (result != null) {
-    //   LoadingDialog.show(StringName.fileImporting.tr);
-    //   AudioPlayer? player;
-    //   try {
-    //     String filePath = result.files.single.path!;
-    //     File file = File(filePath);
-    //     //文件不能超过500M
-    //     if (file.lengthSync() > 500 * 1024 * 1024) {
-    //       ToastUtil.showToast(StringName.fileChoiceSizeLimit.tr);
-    //       return;
-    //     }
-    //     player = AudioPlayer();
-    //     player.setAudioSource(AudioSource.uri(file.uri));
-    //     Duration? duration = await player.durationStream
-    //         .firstWhere((duration) => duration != null);
-    //     if (duration == null) {
-    //       ToastUtil.showToast(StringName.fileAudioDurationCannotObtained.tr);
-    //       return;
-    //     }
-    //     //录音时长不能超过5小时
-    //     if (duration.inHours > 5) {
-    //       ToastUtil.showToast(StringName.fileAudioDurationLimit.tr);
-    //       return;
-    //     }
-    //     late TalkBean bean;
-    //     try {
-    //       bean = await talkRepository.talkCreate(
-    //           const Uuid().v4(), duration.inSeconds,
-    //           localAudioUrl: filePath, uploadType: 1);
-    //     } catch (e) {
-    //       ErrorHandler.toastError(e);
-    //       return;
-    //     }
-    //     String childDirName = bean.id;
-    //     Directory dir = await _getChoiceUploadDir(childDirName);
-    //
-    //     await moveFileToDirectory(file, dir);
-    //
-    //     TalkPage.start(bean);
-    //   } catch (e) {
-    //     ErrorHandler.toastError(e, message: StringName.fileImportFail.tr);
-    //   } finally {
-    //     player?.dispose();
-    //     LoadingDialog.hide();
-    //   }
-    // }
-  }
-
-  Future<void> moveFileToDirectory(File file, Directory dir) async {
-    if (!dir.existsSync()) {
-      dir.createSync(recursive: true);
+    EventHandler.report(EventId.event_100030);
+    if (!accountRepository.isLogin.value) {
+      Get.toNamed(RoutePath.login);
+      ToastUtil.showToast(StringName.errorCodeNoLogin.tr);
+      return;
+    }
+    if (Platform.isAndroid) {
+      _showAndroidFilePicker();
+    } else {
+      FileUploadCheckHelper.choicePlatformLocalFileAndCreateOrder();
     }
-    String newFilePath = '${dir.path}/${file.uri.pathSegments.last}';
-    file.renameSync(newFilePath);
   }
 
   void onGoAgendaList() {
@@ -224,21 +156,11 @@ class HomePageController extends BaseController {
   void onLoginClick() {
     LoginPage.start(fromType: LoginFromType.mainLogin);
   }
-}
 
-Future<Directory> _getChoiceUploadDir(String talkId) async {
-  Directory documentDir = await getApplicationDocumentsDirectory();
-  return Directory("${documentDir.path}/.atmob/choice/$talkId");
-}
-
-Future<File?> getChoiceUploadFile(String talkId) async {
-  Directory dir = await _getChoiceUploadDir(talkId);
-  if (!dir.existsSync()) {
-    return null;
-  }
-  List<FileSystemEntity> list = dir.listSync();
-  if (list.isEmpty) {
-    return null;
+  void _showAndroidFilePicker() {
+    Get.bottomSheet(const AudioPickerPage(),
+        isScrollControlled: true,
+        barrierColor: ColorName.black55,
+        backgroundColor: ColorName.transparent);
   }
-  return list.first as File;
 }

+ 2 - 2
lib/module/talk/controller.dart

@@ -6,7 +6,7 @@ import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/consts/event_report_id.dart';
 import 'package:electronic_assistant/data/repositories/account_repository.dart';
 import 'package:electronic_assistant/data/repositories/task_repository.dart';
-import 'package:electronic_assistant/handler/audio_picker_handler.dart';
+import 'package:electronic_assistant/utils/audio_picker_utils.dart';
 import 'package:electronic_assistant/handler/event_handler.dart';
 import 'package:electronic_assistant/module/chat/view.dart';
 import 'package:electronic_assistant/module/home/controller.dart';
@@ -514,7 +514,7 @@ Future<File?> getFileByTalk(TalkBean? bean) async {
     return null;
   }
   if (bean.uploadType == TalkUploadType.localUpload) {
-    return await AudioPickerHandler.getAssetFile(bean.localAudioUrl);
+    return await AudioPickerUtils.getAssetFile(bean.localAudioUrl);
     // return await getChoiceUploadFile(bean.id);
   } else {
     return await RecordController.getRecordFile(bean.id);

+ 27 - 2
lib/handler/audio_picker_handler.dart

@@ -1,9 +1,10 @@
 import 'dart:io';
 
+import 'package:file_picker/file_picker.dart';
 import 'package:photo_manager/photo_manager.dart';
 
-class AudioPickerHandler {
-  AudioPickerHandler._();
+class AudioPickerUtils {
+  AudioPickerUtils._();
 
   //申请权限
   static Future<bool> requestPermissionExtend() async {
@@ -64,4 +65,28 @@ class AudioPickerHandler {
     AssetEntity? assetEntity = await AssetEntity.fromId(id);
     return await assetEntity?.file;
   }
+
+  //通过平台文件管理器的方式选择单一文件
+  static Future<File?> pickSingleFileByPlatform() async {
+    FilePickerResult? result = await FilePicker.platform
+        .pickFiles(type: FileType.custom, allowedExtensions: [
+      'wav',
+      'mp3',
+      'm4a',
+      'flv',
+      'mp4',
+      'wma',
+      '3gp',
+      'amr',
+      'aac',
+      'ogg-opus',
+      'flac'
+    ]);
+    if (result != null) {
+      String filePath = result.files.single.path!;
+      File file = File(filePath);
+      return file;
+    }
+    return null;
+  }
 }

+ 130 - 0
lib/utils/file_upload_check_helper.dart

@@ -0,0 +1,130 @@
+import 'dart:io';
+
+import 'package:electronic_assistant/utils/pair.dart';
+import 'package:electronic_assistant/utils/toast_util.dart';
+import 'package:get/get.dart';
+import 'package:just_audio/just_audio.dart';
+import 'package:uuid/uuid.dart';
+import '../data/bean/talks.dart';
+import '../data/repositories/talk_repository.dart';
+import '../dialog/loading_dialog.dart';
+import '../module/talk/view.dart';
+import '../resource/string.gen.dart';
+import 'audio_picker_utils.dart';
+import 'package:path_provider/path_provider.dart';
+
+import 'error_handler.dart';
+
+class FileUploadCheckHelper {
+  FileUploadCheckHelper._();
+
+  static Future<void> choicePlatformLocalFileAndCreateOrder() async {
+    TalkBean? bean;
+    try {
+      Pair<File, Duration>? pair =
+          await FileUploadCheckHelper.pickerPlatformFile();
+      if (pair == null) {
+        //未选择文件
+        return;
+      }
+      LoadingDialog.show(StringName.fileImporting.tr);
+      bean = await FileUploadCheckHelper.createTalkFromLocalFile(
+          pair.first, pair.second);
+
+      TalkPage.start(bean);
+    } catch (e) {
+      if (e is PickerException) {
+        ToastUtil.showToast(e.message);
+      } else {
+        ErrorHandler.toastError(e, message: StringName.fileImportFail.tr);
+      }
+    } finally {
+      LoadingDialog.hide();
+    }
+    if (bean != null) {
+      TalkPage.start(bean);
+    }
+  }
+
+  static Future<Duration> checkCanUpload(File file) async {
+    //文件不能超过500M
+    if (file.lengthSync() > 500 * 1024 * 1024) {
+      throw PickerException(StringName.fileChoiceSizeLimit.tr);
+    }
+    AudioPlayer? player;
+    try {
+      player = AudioPlayer();
+      player.setAudioSource(AudioSource.uri(file.uri));
+      Duration? duration = await player.durationStream
+          .firstWhere((duration) => duration != null);
+      if (duration == null) {
+        throw PickerException(StringName.fileAudioDurationCannotObtained.tr);
+      }
+      //录音时长不能超过5小时
+      if (duration.inHours > 5) {
+        throw PickerException(StringName.fileAudioDurationLimit.tr);
+      }
+      return duration;
+    } finally {
+      player?.dispose();
+    }
+  }
+
+  static Future<Pair<File, Duration>?> pickerPlatformFile() async {
+    File? file = await AudioPickerUtils.pickSingleFileByPlatform();
+    if (file == null) {
+      return null;
+    }
+    Duration duration = await checkCanUpload(file);
+    return Pair(file, duration);
+  }
+
+  static Future<TalkBean> createTalkFromLocalFile(
+      File file, Duration duration) async {
+    TalkBean bean = await talkRepository.talkCreate(
+        const Uuid().v4(), duration.inSeconds,
+        uploadType: FileUploadType.local);
+
+    String childDirName = bean.id;
+    Directory dir = await getChoiceUploadDir(childDirName);
+
+    await moveFileToDirectory(file, dir);
+    return bean;
+  }
+
+  static Future<Directory> getChoiceUploadDir(String talkId) async {
+    Directory documentDir = await getApplicationDocumentsDirectory();
+    return Directory("${documentDir.path}/.atmob/choice/$talkId");
+  }
+
+  static Future<File?> getChoiceUploadFile(String talkId) async {
+    Directory dir = await getChoiceUploadDir(talkId);
+    if (!dir.existsSync()) {
+      return null;
+    }
+    List<FileSystemEntity> list = dir.listSync();
+    if (list.isEmpty) {
+      return null;
+    }
+    return list.first as File;
+  }
+
+  static Future<void> moveFileToDirectory(File file, Directory dir) async {
+    if (!dir.existsSync()) {
+      dir.createSync(recursive: true);
+    }
+    String newFilePath = '${dir.path}/${file.uri.pathSegments.last}';
+    file.renameSync(newFilePath);
+  }
+}
+
+class PickerException implements Exception {
+  final String message;
+
+  PickerException(this.message);
+
+  @override
+  String toString() {
+    return 'PickerException: $message';
+  }
+}

+ 6 - 0
lib/utils/pair.dart

@@ -0,0 +1,6 @@
+class Pair<F, S> {
+  final F first;
+  final S second;
+
+  Pair(this.first, this.second);
+}

+ 79 - 63
pubspec.lock

@@ -14,16 +14,8 @@ packages:
     description: dart
     source: sdk
     version: "0.3.2"
-  alipay_kit:
-    dependency: "direct main"
-    description:
-      name: alipay_kit
-      sha256: "6d6086b4cda1e0cd9b29b6dfe8d0ce88b9efc1c9f2c8d6fb39ac24c4e0f79b06"
-      url: "https://pub.dev"
-    source: hosted
-    version: "6.0.0"
   alipay_kit_android:
-    dependency: transitive
+    dependency: "direct main"
     description:
       name: alipay_kit_android
       sha256: "402917c30e5a1c1bb36cab7c99e355f65a98da96c2666657805a985b00937f6f"
@@ -137,10 +129,10 @@ packages:
     dependency: "direct dev"
     description:
       name: build_runner
-      sha256: dd09dd4e2b078992f42aac7f1a622f01882a8492fef08486b27ddde929c19f04
+      sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d"
       url: "https://pub.dev"
     source: hosted
-    version: "2.4.12"
+    version: "2.4.13"
   build_runner_core:
     dependency: transitive
     description:
@@ -385,10 +377,10 @@ packages:
     dependency: transitive
     description:
       name: file
-      sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
+      sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
       url: "https://pub.dev"
     source: hosted
-    version: "7.0.0"
+    version: "7.0.1"
   file_picker:
     dependency: "direct main"
     description:
@@ -422,26 +414,26 @@ packages:
     dependency: "direct main"
     description:
       name: flutter_foreground_task
-      sha256: "2dc789446398606e7977acda63eaa05f347c175f0d19200d3dbf2b3383532ed4"
+      sha256: d8496f95257df0688406b9bc3ff606297b78dde1145cff3d6e6d97cd0c54e023
       url: "https://pub.dev"
     source: hosted
-    version: "8.10.0"
+    version: "8.10.4"
   flutter_gen_core:
     dependency: transitive
     description:
       name: flutter_gen_core
-      sha256: "638d518897f1aefc55a24278968027591d50223a6943b6ae9aa576fe1494d99d"
+      sha256: "46ecf0e317413dd065547887c43f93f55e9653e83eb98dc13dd07d40dd225325"
       url: "https://pub.dev"
     source: hosted
-    version: "5.7.0"
+    version: "5.8.0"
   flutter_gen_runner:
     dependency: "direct dev"
     description:
       name: flutter_gen_runner
-      sha256: "7f2f02d95e3ec96cf70a1c515700c0dd3ea905af003303a55d6fb081240e6b8a"
+      sha256: "77f0a02fc30d9fcf2549fe874eb3fde091435724904bcbb1af60aa40cbfab1f4"
       url: "https://pub.dev"
     source: hosted
-    version: "5.7.0"
+    version: "5.8.0"
   flutter_launcher_icons:
     dependency: "direct dev"
     description:
@@ -462,10 +454,10 @@ packages:
     dependency: transitive
     description:
       name: flutter_plugin_android_lifecycle
-      sha256: "9ee02950848f61c4129af3d6ec84a1cfc0e47931abc746b03e7a3bc3e8ff6eda"
+      sha256: "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398"
       url: "https://pub.dev"
     source: hosted
-    version: "2.0.22"
+    version: "2.0.23"
   flutter_screenutil:
     dependency: "direct main"
     description:
@@ -478,10 +470,10 @@ packages:
     dependency: "direct main"
     description:
       name: flutter_smart_dialog
-      sha256: de60eec7036cc1d04954ceb8d03ecc3b0759c880e804d82d47be36065e72398e
+      sha256: "7932ab58440379094c6a568efc329d322c6dd740e5a553080f2d56a71ed53752"
       url: "https://pub.dev"
     source: hosted
-    version: "4.9.8+2"
+    version: "4.9.8+3"
   flutter_svg:
     dependency: transitive
     description:
@@ -655,10 +647,10 @@ packages:
     dependency: transitive
     description:
       name: image_size_getter
-      sha256: f98c4246144e9b968899d2dfde69091e22a539bb64bc9b0bea51505fbb490e57
+      sha256: "0511799498340b70993d2dfb34b55a2247b5b801d75a6cdd4543acfcafdb12b0"
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.3"
+    version: "2.2.0"
   in_app_purchase:
     dependency: "direct main"
     description:
@@ -671,10 +663,10 @@ packages:
     dependency: transitive
     description:
       name: in_app_purchase_android
-      sha256: "25eb8694819caca282a527c26d5a1775164965c554ee99b9c10f3a0e44675c75"
+      sha256: "6bbb526f2a405d9fe6556bb33e63fbeaff13fde3e42207b19aa5300eca9a1de6"
       url: "https://pub.dev"
     source: hosted
-    version: "0.3.6+8"
+    version: "0.3.6+10"
   in_app_purchase_platform_interface:
     dependency: transitive
     description:
@@ -727,10 +719,10 @@ packages:
     dependency: "direct main"
     description:
       name: just_audio
-      sha256: d8e8aaf417d33e345299c17f6457f72bd4ba0c549dc34607abb5183a354edc4d
+      sha256: b41646a8241688f1d99c2e69c4da2bb26aa4b3a99795f6ff205c2a165e033fda
       url: "https://pub.dev"
     source: hosted
-    version: "0.9.40"
+    version: "0.9.41"
   just_audio_platform_interface:
     dependency: transitive
     description:
@@ -839,10 +831,10 @@ packages:
     dependency: transitive
     description:
       name: mime
-      sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a"
+      sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.6"
+    version: "2.0.0"
   mmkv:
     dependency: "direct main"
     description:
@@ -919,10 +911,10 @@ packages:
     dependency: "direct main"
     description:
       name: package_info_plus
-      sha256: a75164ade98cb7d24cfd0a13c6408927c6b217fa60dee5a7ff5c116a58f28918
+      sha256: "894f37107424311bdae3e476552229476777b8752c5a2a2369c0cb9a2d5442ef"
       url: "https://pub.dev"
     source: hosted
-    version: "8.0.2"
+    version: "8.0.3"
   package_info_plus_platform_interface:
     dependency: transitive
     description:
@@ -959,10 +951,10 @@ packages:
     dependency: transitive
     description:
       name: path_provider_android
-      sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7"
+      sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.10"
+    version: "2.2.12"
   path_provider_foundation:
     dependency: transitive
     description:
@@ -1167,18 +1159,18 @@ packages:
     dependency: transitive
     description:
       name: shared_preferences_android
-      sha256: "480ba4345773f56acda9abf5f50bd966f581dac5d514e5fc4a18c62976bbba7e"
+      sha256: "3b9febd815c9ca29c9e3520d50ec32f49157711e143b7a4ca039eb87e8ade5ab"
       url: "https://pub.dev"
     source: hosted
-    version: "2.3.2"
+    version: "2.3.3"
   shared_preferences_foundation:
     dependency: transitive
     description:
       name: shared_preferences_foundation
-      sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f
+      sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d"
       url: "https://pub.dev"
     source: hosted
-    version: "2.5.2"
+    version: "2.5.3"
   shared_preferences_linux:
     dependency: transitive
     description:
@@ -1268,18 +1260,42 @@ packages:
     dependency: transitive
     description:
       name: sqflite
-      sha256: ff5a2436ef8ebdfda748fbfe957f9981524cb5ff11e7bafa8c42771840e8a788
+      sha256: "79a297dc3cc137e758c6a4baf83342b039e5a6d2436fcdf3f96a00adaaf2ad62"
       url: "https://pub.dev"
     source: hosted
-    version: "2.3.3+2"
+    version: "2.4.0"
+  sqflite_android:
+    dependency: transitive
+    description:
+      name: sqflite_android
+      sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.4.0"
   sqflite_common:
     dependency: transitive
     description:
       name: sqflite_common
-      sha256: "2d8e607db72e9cb7748c9c6e739e2c9618320a5517de693d5a24609c4671b1a4"
+      sha256: "4468b24876d673418a7b7147e5a08a715b4998a7ae69227acafaab762e0e5490"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.5.4+5"
+  sqflite_darwin:
+    dependency: transitive
+    description:
+      name: sqflite_darwin
+      sha256: "769733dddf94622d5541c73e4ddc6aa7b252d865285914b6fcd54a63c4b4f027"
       url: "https://pub.dev"
     source: hosted
-    version: "2.5.4+4"
+    version: "2.4.1-1"
+  sqflite_platform_interface:
+    dependency: transitive
+    description:
+      name: sqflite_platform_interface
+      sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.4.0"
   stack_trace:
     dependency: transitive
     description:
@@ -1372,18 +1388,18 @@ packages:
     dependency: transitive
     description:
       name: url_launcher
-      sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3"
+      sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
       url: "https://pub.dev"
     source: hosted
-    version: "6.3.0"
+    version: "6.3.1"
   url_launcher_android:
     dependency: transitive
     description:
       name: url_launcher_android
-      sha256: e35a698ac302dd68e41f73250bd9517fe3ab5fa4f18fe4647a0872db61bacbab
+      sha256: "8fc3bae0b68c02c47c5c86fa8bfa74471d42687b0eded01b78de87872db745e2"
       url: "https://pub.dev"
     source: hosted
-    version: "6.3.10"
+    version: "6.3.12"
   url_launcher_ios:
     dependency: transitive
     description:
@@ -1476,34 +1492,34 @@ packages:
     dependency: transitive
     description:
       name: video_player
-      sha256: e30df0d226c4ef82e2c150ebf6834b3522cf3f654d8e2f9419d376cdc071425d
+      sha256: "4a8c3492d734f7c39c2588a3206707a05ee80cef52e8c7f3b2078d430c84bc17"
       url: "https://pub.dev"
     source: hosted
-    version: "2.9.1"
+    version: "2.9.2"
   video_player_android:
     dependency: transitive
     description:
       name: video_player_android
-      sha256: "45d21bbba3d10b7182aa08ade5d4c68ed3367016d40f29732bb04a799b26842d"
+      sha256: "340b29bc38b2c341ed3afa08148f3d9f351220403cdd2b3a9eb38b71a4be1a9d"
       url: "https://pub.dev"
     source: hosted
-    version: "2.7.5"
+    version: "2.7.12"
   video_player_avfoundation:
     dependency: transitive
     description:
       name: video_player_avfoundation
-      sha256: d1e9a824f2b324000dc8fb2dcb2a3285b6c1c7c487521c63306cc5b394f68a7c
+      sha256: cd5ab8a8bc0eab65ab0cea40304097edc46da574c8c1ecdee96f28cd8ef3792f
       url: "https://pub.dev"
     source: hosted
-    version: "2.6.1"
+    version: "2.6.2"
   video_player_platform_interface:
     dependency: transitive
     description:
       name: video_player_platform_interface
-      sha256: "236454725fafcacf98f0f39af0d7c7ab2ce84762e3b63f2cbb3ef9a7e0550bc6"
+      sha256: "229d7642ccd9f3dc4aba169609dd6b5f3f443bb4cc15b82f7785fcada5af9bbb"
       url: "https://pub.dev"
     source: hosted
-    version: "6.2.2"
+    version: "6.2.3"
   video_player_web:
     dependency: transitive
     description:
@@ -1580,10 +1596,10 @@ packages:
     dependency: transitive
     description:
       name: webview_flutter_android
-      sha256: "6e64fcb1c19d92024da8f33503aaeeda35825d77142c01d0ea2aa32edc79fdc8"
+      sha256: "47a8da40d02befda5b151a26dba71f47df471cddd91dfdb7802d0a87c5442558"
       url: "https://pub.dev"
     source: hosted
-    version: "3.16.7"
+    version: "3.16.9"
   webview_flutter_platform_interface:
     dependency: transitive
     description:
@@ -1596,10 +1612,10 @@ packages:
     dependency: transitive
     description:
       name: webview_flutter_wkwebview
-      sha256: "1942a12224ab31e9508cf00c0c6347b931b023b8a4f0811e5dec3b06f94f117d"
+      sha256: d4034901d96357beb1b6717ebf7d583c88e40cfc6eb85fe76dd1bf0979a9f251
       url: "https://pub.dev"
     source: hosted
-    version: "3.15.0"
+    version: "3.16.0"
   wechat_kit:
     dependency: "direct main"
     description:
@@ -1612,10 +1628,10 @@ packages:
     dependency: transitive
     description:
       name: win32
-      sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a"
+      sha256: "4d45dc9069dba4619dc0ebd93c7cec5e66d8482cb625a370ac806dcc8165f2ec"
       url: "https://pub.dev"
     source: hosted
-    version: "5.5.4"
+    version: "5.5.5"
   win32_registry:
     dependency: transitive
     description:
@@ -1628,10 +1644,10 @@ packages:
     dependency: transitive
     description:
       name: xdg_directories
-      sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
+      sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.4"
+    version: "1.1.0"
   xml:
     dependency: transitive
     description: