Compare commits
17 Commits
0c7fbe5897
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 7781fcd17a | |||
| 6e1b5c2de0 | |||
| cf2826c1cf | |||
| ad0d329b3b | |||
| 89bd367a64 | |||
| 79455627f7 | |||
| a1b98e987e | |||
| 037f14b52f | |||
| aa89e03bee | |||
| 1c971fb0b2 | |||
| aa47bc97d5 | |||
| 0b45f6a6c1 | |||
| 7f077cf513 | |||
| 8ba36d9700 | |||
| b380daf206 | |||
| 89dbb79256 | |||
| 79eb8a891b |
@@ -57,9 +57,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "code_assets",
|
"name": "code_assets",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/code_assets-1.0.0",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/code_assets-1.2.1",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.9"
|
"languageVersion": "3.10"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "collection",
|
"name": "collection",
|
||||||
@@ -105,7 +105,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "dbus",
|
"name": "dbus",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/dbus-0.7.12",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/dbus-0.7.14",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "2.17"
|
"languageVersion": "2.17"
|
||||||
},
|
},
|
||||||
@@ -333,9 +333,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "flutter_plugin_android_lifecycle",
|
"name": "flutter_plugin_android_lifecycle",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/flutter_plugin_android_lifecycle-2.0.34",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/flutter_plugin_android_lifecycle-2.0.35",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.9"
|
"languageVersion": "3.10"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "flutter_screenutil",
|
"name": "flutter_screenutil",
|
||||||
@@ -385,12 +385,6 @@
|
|||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "2.15"
|
"languageVersion": "2.15"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "glob",
|
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/glob-2.1.3",
|
|
||||||
"packageUri": "lib/",
|
|
||||||
"languageVersion": "3.3"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "hand_signature",
|
"name": "hand_signature",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/hand_signature-3.1.0+2",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/hand_signature-3.1.0+2",
|
||||||
@@ -399,7 +393,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "hooks",
|
"name": "hooks",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/hooks-1.0.2",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/hooks-2.0.2",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.10"
|
"languageVersion": "3.10"
|
||||||
},
|
},
|
||||||
@@ -447,13 +441,13 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "image_picker",
|
"name": "image_picker",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/image_picker-1.2.1",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/image_picker-1.2.2",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.7"
|
"languageVersion": "3.9"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "image_picker_android",
|
"name": "image_picker_android",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/image_picker_android-0.8.13+16",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/image_picker_android-0.8.13+17",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.9"
|
"languageVersion": "3.9"
|
||||||
},
|
},
|
||||||
@@ -577,12 +571,6 @@
|
|||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.2"
|
"languageVersion": "3.2"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "native_toolchain_c",
|
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/native_toolchain_c-0.17.6",
|
|
||||||
"packageUri": "lib/",
|
|
||||||
"languageVersion": "3.10"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "nested",
|
"name": "nested",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/nested-1.0.0",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/nested-1.0.0",
|
||||||
@@ -591,7 +579,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "objective_c",
|
"name": "objective_c",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/objective_c-9.3.0",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/objective_c-9.4.1",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.10"
|
"languageVersion": "3.10"
|
||||||
},
|
},
|
||||||
@@ -675,7 +663,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "permission_handler_apple",
|
"name": "permission_handler_apple",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_apple-9.4.7",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_apple-9.4.9",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "2.18"
|
"languageVersion": "2.18"
|
||||||
},
|
},
|
||||||
@@ -763,6 +751,12 @@
|
|||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "2.14"
|
"languageVersion": "2.14"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "record_use",
|
||||||
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/record_use-0.6.0",
|
||||||
|
"packageUri": "lib/",
|
||||||
|
"languageVersion": "3.10"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "reorderables",
|
"name": "reorderables",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/reorderables-0.6.0",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/reorderables-0.6.0",
|
||||||
@@ -777,43 +771,43 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "screen_brightness",
|
"name": "screen_brightness",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness-2.1.7",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness-2.1.9",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.0"
|
"languageVersion": "3.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "screen_brightness_android",
|
"name": "screen_brightness_android",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_android-2.1.3",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_android-2.1.5",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.0"
|
"languageVersion": "3.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "screen_brightness_ios",
|
"name": "screen_brightness_ios",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_ios-2.1.2",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_ios-2.1.3",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.0"
|
"languageVersion": "3.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "screen_brightness_macos",
|
"name": "screen_brightness_macos",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_macos-2.1.1",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_macos-2.1.2",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.0"
|
"languageVersion": "3.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "screen_brightness_ohos",
|
"name": "screen_brightness_ohos",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_ohos-2.1.2",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_ohos-2.1.3",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.0"
|
"languageVersion": "3.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "screen_brightness_platform_interface",
|
"name": "screen_brightness_platform_interface",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_platform_interface-2.1.0",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_platform_interface-2.1.1",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.0"
|
"languageVersion": "3.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "screen_brightness_windows",
|
"name": "screen_brightness_windows",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_windows-2.1.0",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_windows-2.1.1",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.0"
|
"languageVersion": "3.0"
|
||||||
},
|
},
|
||||||
@@ -885,9 +879,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sqflite",
|
"name": "sqflite",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/sqflite-2.4.2",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/sqflite-2.4.2+1",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.7"
|
"languageVersion": "3.10"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sqflite_android",
|
"name": "sqflite_android",
|
||||||
@@ -897,9 +891,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sqflite_common",
|
"name": "sqflite_common",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/sqflite_common-2.5.6",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/sqflite_common-2.5.8",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.8"
|
"languageVersion": "3.10"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sqflite_darwin",
|
"name": "sqflite_darwin",
|
||||||
@@ -975,9 +969,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "url_launcher_android",
|
"name": "url_launcher_android",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_android-6.3.29",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_android-6.3.30",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.9"
|
"languageVersion": "3.10"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "url_launcher_ios",
|
"name": "url_launcher_ios",
|
||||||
@@ -1005,7 +999,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "url_launcher_web",
|
"name": "url_launcher_web",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_web-2.4.2",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_web-2.4.3",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.10"
|
"languageVersion": "3.10"
|
||||||
},
|
},
|
||||||
@@ -1041,15 +1035,15 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "video_player_avfoundation",
|
"name": "video_player_avfoundation",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/video_player_avfoundation-2.9.4",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/video_player_avfoundation-2.9.7",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.10"
|
"languageVersion": "3.10"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "video_player_platform_interface",
|
"name": "video_player_platform_interface",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/video_player_platform_interface-6.6.0",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/video_player_platform_interface-6.7.0",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.7"
|
"languageVersion": "3.9"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "video_player_web",
|
"name": "video_player_web",
|
||||||
@@ -1065,7 +1059,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vm_service",
|
"name": "vm_service",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/vm_service-15.1.0",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/vm_service-15.2.0",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.5"
|
"languageVersion": "3.5"
|
||||||
},
|
},
|
||||||
@@ -1077,7 +1071,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "wakelock_plus_platform_interface",
|
"name": "wakelock_plus_platform_interface",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/wakelock_plus_platform_interface-1.4.0",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/wakelock_plus_platform_interface-1.5.1",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.10"
|
"languageVersion": "3.10"
|
||||||
},
|
},
|
||||||
@@ -1089,7 +1083,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "wechat_assets_picker",
|
"name": "wechat_assets_picker",
|
||||||
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/wechat_assets_picker-10.1.1",
|
"rootUri": "file:///Users/threeone/.pub-cache/hosted/pub.flutter-io.cn/wechat_assets_picker-10.1.2",
|
||||||
"packageUri": "lib/",
|
"packageUri": "lib/",
|
||||||
"languageVersion": "3.6"
|
"languageVersion": "3.6"
|
||||||
},
|
},
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Generated
+6
@@ -63,6 +63,12 @@
|
|||||||
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/volume_controller/example/.dart_tool" />
|
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/volume_controller/example/.dart_tool" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/volume_controller/example/.pub" />
|
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/volume_controller/example/.pub" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/volume_controller/example/build" />
|
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/volume_controller/example/build" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/jni/.dart_tool" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/jni/.pub" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/jni/build" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/jni/example/.dart_tool" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/jni/example/.pub" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/jni/example/build" />
|
||||||
</content>
|
</content>
|
||||||
<orderEntry type="inheritedJdk" />
|
<orderEntry type="inheritedJdk" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
|||||||
Generated
+64
-72
@@ -68,7 +68,7 @@
|
|||||||
<entry key="code_assets">
|
<entry key="code_assets">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/code_assets-1.0.0/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/code_assets-1.2.1/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -131,7 +131,7 @@
|
|||||||
<entry key="dbus">
|
<entry key="dbus">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/dbus-0.7.12/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/dbus-0.7.14/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -271,7 +271,7 @@
|
|||||||
<entry key="flutter">
|
<entry key="flutter">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/flutter/packages/flutter/lib" />
|
<option value="$PROJECT_DIR$/../../flutter/packages/flutter/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -397,7 +397,7 @@
|
|||||||
<entry key="flutter_plugin_android_lifecycle">
|
<entry key="flutter_plugin_android_lifecycle">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_plugin_android_lifecycle-2.0.34/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_plugin_android_lifecycle-2.0.35/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -425,14 +425,14 @@
|
|||||||
<entry key="flutter_test">
|
<entry key="flutter_test">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/flutter/packages/flutter_test/lib" />
|
<option value="$PROJECT_DIR$/../../flutter/packages/flutter_test/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
<entry key="flutter_web_plugins">
|
<entry key="flutter_web_plugins">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/flutter/packages/flutter_web_plugins/lib" />
|
<option value="$PROJECT_DIR$/../../flutter/packages/flutter_web_plugins/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -457,13 +457,6 @@
|
|||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
<entry key="glob">
|
|
||||||
<value>
|
|
||||||
<list>
|
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/glob-2.1.3/lib" />
|
|
||||||
</list>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="hand_signature">
|
<entry key="hand_signature">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
@@ -474,7 +467,7 @@
|
|||||||
<entry key="hooks">
|
<entry key="hooks">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/hooks-1.0.2/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/hooks-2.0.2/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -530,14 +523,14 @@
|
|||||||
<entry key="image_picker">
|
<entry key="image_picker">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker-1.2.1/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker-1.2.2/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
<entry key="image_picker_android">
|
<entry key="image_picker_android">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_android-0.8.13+16/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_android-0.8.13+17/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -681,13 +674,6 @@
|
|||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
<entry key="native_toolchain_c">
|
|
||||||
<value>
|
|
||||||
<list>
|
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/native_toolchain_c-0.17.6/lib" />
|
|
||||||
</list>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="nested">
|
<entry key="nested">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
@@ -698,7 +684,7 @@
|
|||||||
<entry key="objective_c">
|
<entry key="objective_c">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/objective_c-9.3.0/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/objective_c-9.4.1/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -796,7 +782,7 @@
|
|||||||
<entry key="permission_handler_apple">
|
<entry key="permission_handler_apple">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_apple-9.4.7/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_apple-9.4.9/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -898,6 +884,13 @@
|
|||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
|
<entry key="record_use">
|
||||||
|
<value>
|
||||||
|
<list>
|
||||||
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/record_use-0.6.0/lib" />
|
||||||
|
</list>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
<entry key="reorderables">
|
<entry key="reorderables">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
@@ -915,49 +908,49 @@
|
|||||||
<entry key="screen_brightness">
|
<entry key="screen_brightness">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness-2.1.7/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness-2.1.9/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
<entry key="screen_brightness_android">
|
<entry key="screen_brightness_android">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_android-2.1.3/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_android-2.1.5/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
<entry key="screen_brightness_ios">
|
<entry key="screen_brightness_ios">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_ios-2.1.2/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_ios-2.1.3/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
<entry key="screen_brightness_macos">
|
<entry key="screen_brightness_macos">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_macos-2.1.1/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_macos-2.1.2/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
<entry key="screen_brightness_ohos">
|
<entry key="screen_brightness_ohos">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_ohos-2.1.2/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_ohos-2.1.3/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
<entry key="screen_brightness_platform_interface">
|
<entry key="screen_brightness_platform_interface">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_platform_interface-2.1.0/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_platform_interface-2.1.1/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
<entry key="screen_brightness_windows">
|
<entry key="screen_brightness_windows">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_windows-2.1.0/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_windows-2.1.1/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -1020,7 +1013,7 @@
|
|||||||
<entry key="sky_engine">
|
<entry key="sky_engine">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/flutter/bin/cache/pkg/sky_engine/lib" />
|
<option value="$PROJECT_DIR$/../../flutter/bin/cache/pkg/sky_engine/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -1041,7 +1034,7 @@
|
|||||||
<entry key="sqflite">
|
<entry key="sqflite">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite-2.4.2/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite-2.4.2+1/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -1055,7 +1048,7 @@
|
|||||||
<entry key="sqflite_common">
|
<entry key="sqflite_common">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_common-2.5.6/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_common-2.5.8/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -1146,7 +1139,7 @@
|
|||||||
<entry key="url_launcher_android">
|
<entry key="url_launcher_android">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_android-6.3.29/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_android-6.3.30/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -1181,7 +1174,7 @@
|
|||||||
<entry key="url_launcher_web">
|
<entry key="url_launcher_web">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_web-2.4.2/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_web-2.4.3/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -1223,14 +1216,14 @@
|
|||||||
<entry key="video_player_avfoundation">
|
<entry key="video_player_avfoundation">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_avfoundation-2.9.4/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_avfoundation-2.9.7/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
<entry key="video_player_platform_interface">
|
<entry key="video_player_platform_interface">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_platform_interface-6.6.0/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_platform_interface-6.7.0/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -1251,7 +1244,7 @@
|
|||||||
<entry key="vm_service">
|
<entry key="vm_service">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/vm_service-15.1.0/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/vm_service-15.2.0/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -1265,7 +1258,7 @@
|
|||||||
<entry key="wakelock_plus_platform_interface">
|
<entry key="wakelock_plus_platform_interface">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wakelock_plus_platform_interface-1.4.0/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wakelock_plus_platform_interface-1.5.1/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -1279,7 +1272,7 @@
|
|||||||
<entry key="wechat_assets_picker">
|
<entry key="wechat_assets_picker">
|
||||||
<value>
|
<value>
|
||||||
<list>
|
<list>
|
||||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wechat_assets_picker-10.1.1/lib" />
|
<option value="$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wechat_assets_picker-10.1.2/lib" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -1337,7 +1330,7 @@
|
|||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/cached_network_image_web-1.3.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/cached_network_image_web-1.3.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/characters-1.4.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/characters-1.4.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/clock-1.1.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/clock-1.1.2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/code_assets-1.0.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/code_assets-1.2.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/collection-1.19.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/collection-1.19.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/colorfilter_generator-0.0.8/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/colorfilter_generator-0.0.8/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/common_utils-2.1.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/common_utils-2.1.0/lib" />
|
||||||
@@ -1346,7 +1339,7 @@
|
|||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/crypto-3.0.7/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/crypto-3.0.7/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/csslib-1.0.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/csslib-1.0.2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/cupertino_icons-1.0.9/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/cupertino_icons-1.0.9/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/dbus-0.7.12/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/dbus-0.7.14/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/decimal-3.2.4/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/decimal-3.2.4/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/device_info_plus-11.5.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/device_info_plus-11.5.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/device_info_plus_platform_interface-7.0.3/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/device_info_plus_platform_interface-7.0.3/lib" />
|
||||||
@@ -1383,16 +1376,15 @@
|
|||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_web-1.1.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_web-1.1.2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_windows-0.6.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_windows-0.6.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_lints-5.0.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_lints-5.0.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_plugin_android_lifecycle-2.0.34/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_plugin_android_lifecycle-2.0.35/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_screenutil-5.9.3/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_screenutil-5.9.3/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_spinkit-5.2.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_spinkit-5.2.2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_staggered_grid_view-0.7.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_staggered_grid_view-0.7.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_widget_from_html_core-0.16.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_widget_from_html_core-0.16.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/font_awesome_flutter-10.12.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/font_awesome_flutter-10.12.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/get-4.7.3/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/get-4.7.3/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/glob-2.1.3/lib" />
|
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/hand_signature-3.1.0+2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/hand_signature-3.1.0+2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/hooks-1.0.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/hooks-2.0.2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/html-0.15.6/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/html-0.15.6/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/http-1.6.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/http-1.6.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/http_client_helper-3.0.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/http_client_helper-3.0.0/lib" />
|
||||||
@@ -1400,8 +1392,8 @@
|
|||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image-4.8.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image-4.8.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_editor_plus-1.0.6/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_editor_plus-1.0.6/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_gallery_saver_plus-4.0.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_gallery_saver_plus-4.0.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker-1.2.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker-1.2.2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_android-0.8.13+16/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_android-0.8.13+17/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_for_web-3.1.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_for_web-3.1.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_ios-0.8.13+6/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_ios-0.8.13+6/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_linux-0.2.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_linux-0.2.2/lib" />
|
||||||
@@ -1422,9 +1414,8 @@
|
|||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/matrix2d-1.0.4/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/matrix2d-1.0.4/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/meta-1.17.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/meta-1.17.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/mime-2.0.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/mime-2.0.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/native_toolchain_c-0.17.6/lib" />
|
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/nested-1.0.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/nested-1.0.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/objective_c-9.3.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/objective_c-9.4.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/octo_image-2.1.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/octo_image-2.1.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/package_config-2.2.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/package_config-2.2.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/package_info_plus-9.0.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/package_info_plus-9.0.1/lib" />
|
||||||
@@ -1438,7 +1429,7 @@
|
|||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider_windows-2.3.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider_windows-2.3.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler-11.4.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler-11.4.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_android-12.1.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_android-12.1.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_apple-9.4.7/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_apple-9.4.9/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_html-0.1.3+5/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_html-0.1.3+5/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_platform_interface-4.3.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_platform_interface-4.3.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_windows-0.2.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_windows-0.2.1/lib" />
|
||||||
@@ -1453,15 +1444,16 @@
|
|||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/pub_semver-2.2.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/pub_semver-2.2.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/pull_to_refresh-2.0.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/pull_to_refresh-2.0.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/rational-2.2.3/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/rational-2.2.3/lib" />
|
||||||
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/record_use-0.6.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/reorderables-0.6.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/reorderables-0.6.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/rxdart-0.28.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/rxdart-0.28.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness-2.1.7/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness-2.1.9/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_android-2.1.3/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_android-2.1.5/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_ios-2.1.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_ios-2.1.3/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_macos-2.1.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_macos-2.1.2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_ohos-2.1.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_ohos-2.1.3/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_platform_interface-2.1.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_platform_interface-2.1.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_windows-2.1.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness_windows-2.1.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screenshot-3.0.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screenshot-3.0.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences-2.5.5/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences-2.5.5/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_android-2.4.23/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_android-2.4.23/lib" />
|
||||||
@@ -1472,9 +1464,9 @@
|
|||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_windows-2.4.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_windows-2.4.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/source_span-1.10.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/source_span-1.10.2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sp_util-2.0.3/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sp_util-2.0.3/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite-2.4.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite-2.4.2+1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_android-2.4.2+3/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_android-2.4.2+3/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_common-2.5.6/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_common-2.5.8/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_darwin-2.4.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_darwin-2.4.2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_platform_interface-2.4.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_platform_interface-2.4.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/stack_trace-1.12.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/stack_trace-1.12.1/lib" />
|
||||||
@@ -1487,36 +1479,36 @@
|
|||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/transparent_image-2.0.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/transparent_image-2.0.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/typed_data-1.4.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/typed_data-1.4.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher-6.3.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher-6.3.2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_android-6.3.29/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_android-6.3.30/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_ios-6.4.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_ios-6.4.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_linux-3.2.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_linux-3.2.2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_macos-3.2.5/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_macos-3.2.5/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_platform_interface-2.3.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_platform_interface-2.3.2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_web-2.4.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_web-2.4.3/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_windows-3.1.5/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_windows-3.1.5/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/uuid-4.5.3/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/uuid-4.5.3/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/vector_math-2.2.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/vector_math-2.2.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player-2.11.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player-2.11.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_android-2.9.5/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_android-2.9.5/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_avfoundation-2.9.4/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_avfoundation-2.9.7/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_platform_interface-6.6.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_platform_interface-6.7.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_web-2.4.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_web-2.4.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/visibility_detector-0.4.0+2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/visibility_detector-0.4.0+2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/vm_service-15.1.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/vm_service-15.2.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wakelock_plus-1.5.2/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wakelock_plus-1.5.2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wakelock_plus_platform_interface-1.4.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wakelock_plus_platform_interface-1.5.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/web-1.1.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/web-1.1.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wechat_assets_picker-10.1.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wechat_assets_picker-10.1.2/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wechat_picker_library-1.0.7/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wechat_picker_library-1.0.7/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/win32-5.15.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/win32-5.15.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/win32_registry-2.1.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/win32_registry-2.1.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/xdg_directories-1.1.0/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/xdg_directories-1.1.0/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/xml-6.6.1/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/xml-6.6.1/lib" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/yaml-3.1.3/lib" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/yaml-3.1.3/lib" />
|
||||||
<root url="file://$USER_HOME$/flutter/bin/cache/pkg/sky_engine/lib" />
|
<root url="file://$PROJECT_DIR$/../../flutter/bin/cache/pkg/sky_engine/lib" />
|
||||||
<root url="file://$USER_HOME$/flutter/packages/flutter/lib" />
|
<root url="file://$PROJECT_DIR$/../../flutter/packages/flutter/lib" />
|
||||||
<root url="file://$USER_HOME$/flutter/packages/flutter_test/lib" />
|
<root url="file://$PROJECT_DIR$/../../flutter/packages/flutter_test/lib" />
|
||||||
<root url="file://$USER_HOME$/flutter/packages/flutter_web_plugins/lib" />
|
<root url="file://$PROJECT_DIR$/../../flutter/packages/flutter_web_plugins/lib" />
|
||||||
</CLASSES>
|
</CLASSES>
|
||||||
<JAVADOC />
|
<JAVADOC />
|
||||||
<SOURCES />
|
<SOURCES />
|
||||||
|
|||||||
Generated
+7
-7
@@ -9,21 +9,17 @@
|
|||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_windows-2.4.1" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_windows-2.4.1" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_windows-0.6.0" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_windows-0.6.0" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_web-2.4.0" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_web-2.4.0" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness-2.1.7" />
|
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/device_info_plus-11.5.0" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/device_info_plus-11.5.0" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker-1.2.1" />
|
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_for_web-3.1.1" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_for_web-3.1.1" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler-11.4.0" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler-11.4.0" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview-6.1.5" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview-6.1.5" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/file_selector_linux-0.9.4" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/file_selector_linux-0.9.4" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_android-1.1.3" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_android-1.1.3" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_windows-3.1.5" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_windows-3.1.5" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite-2.4.2" />
|
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider-2.1.5" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider-2.1.5" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/file_selector_windows-0.9.3+5" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/file_selector_windows-0.9.3+5" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_web-2.4.3" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_web-2.4.3" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_macos-3.2.5" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_macos-3.2.5" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_web-2.4.2" />
|
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_windows-0.2.2" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_windows-0.2.2" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_foundation-2.5.6" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_foundation-2.5.6" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher-6.3.2" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher-6.3.2" />
|
||||||
@@ -36,9 +32,7 @@
|
|||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_darwin-2.4.2" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_darwin-2.4.2" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_ios-1.1.2" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_ios-1.1.2" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_linux-2.4.1" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_linux-2.4.1" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_android-0.8.13+16" />
|
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences-2.5.5" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences-2.5.5" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_android-6.3.29" />
|
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_web-0.1.5" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_web-0.1.5" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_ios-6.4.1" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_ios-6.4.1" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_macos-1.0.3" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_macos-1.0.3" />
|
||||||
@@ -46,7 +40,6 @@
|
|||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player-2.11.1" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player-2.11.1" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_common-1.0.6" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_common-1.0.6" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider_android-2.3.1" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider_android-2.3.1" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_avfoundation-2.9.4" />
|
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_android-2.9.5" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_android-2.9.5" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/jni_flutter-1.0.1" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/jni_flutter-1.0.1" />
|
||||||
@@ -57,6 +50,13 @@
|
|||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress-2.4.0" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress-2.4.0" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_ios-0.8.13+6" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_ios-0.8.13+6" />
|
||||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wakelock_plus-1.5.2" />
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wakelock_plus-1.5.2" />
|
||||||
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_android-0.8.13+17" />
|
||||||
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker-1.2.2" />
|
||||||
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_android-6.3.30" />
|
||||||
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_web-2.4.3" />
|
||||||
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_avfoundation-2.9.7" />
|
||||||
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite-2.4.2+1" />
|
||||||
|
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness-2.1.9" />
|
||||||
</CLASSES>
|
</CLASSES>
|
||||||
<JAVADOC />
|
<JAVADOC />
|
||||||
<SOURCES />
|
<SOURCES />
|
||||||
|
|||||||
+56
-64
@@ -77,10 +77,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: code_assets
|
name: code_assets
|
||||||
sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687"
|
sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.0"
|
version: "1.2.1"
|
||||||
collection:
|
collection:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -149,10 +149,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: dbus
|
name: dbus
|
||||||
sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270
|
sha256: "0ce9b0a839e6dee59a37a623d2fc26a35bbbe6404213e419b0d6411023d62645"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.12"
|
version: "0.7.14"
|
||||||
decimal:
|
decimal:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -457,10 +457,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_plugin_android_lifecycle
|
name: flutter_plugin_android_lifecycle
|
||||||
sha256: "38d1c268de9097ff59cf0e844ac38759fc78f76836d37edad06fa21e182055a0"
|
sha256: "3854fe5e3bff0b113c658f260b90c95dea17c92db0f2addeac2e343dd9969785"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.34"
|
version: "2.0.35"
|
||||||
flutter_screenutil:
|
flutter_screenutil:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -519,14 +519,6 @@ packages:
|
|||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.7.3"
|
version: "4.7.3"
|
||||||
glob:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: glob
|
|
||||||
sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
|
|
||||||
url: "https://pub.flutter-io.cn"
|
|
||||||
source: hosted
|
|
||||||
version: "2.1.3"
|
|
||||||
hand_signature:
|
hand_signature:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -539,10 +531,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: hooks
|
name: hooks
|
||||||
sha256: e79ed1e8e1929bc6ecb6ec85f0cb519c887aa5b423705ded0d0f2d9226def388
|
sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.2"
|
version: "2.0.2"
|
||||||
html:
|
html:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -603,18 +595,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: image_picker
|
name: image_picker
|
||||||
sha256: "784210112be18ea55f69d7076e2c656a4e24949fa9e76429fe53af0c0f4fa320"
|
sha256: "91c025426c2881c551100bce834e201c835a170151545f58d17da5180ca7d9ac"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.1"
|
version: "1.2.2"
|
||||||
image_picker_android:
|
image_picker_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: image_picker_android
|
name: image_picker_android
|
||||||
sha256: "66810af8e99b2657ee98e5c6f02064f69bb63f7a70e343937f70946c5f8c6622"
|
sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.8.13+16"
|
version: "0.8.13+17"
|
||||||
image_picker_for_web:
|
image_picker_for_web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -775,14 +767,6 @@ packages:
|
|||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.0"
|
||||||
native_toolchain_c:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: native_toolchain_c
|
|
||||||
sha256: "6ba77bb18063eebe9de401f5e6437e95e1438af0a87a3a39084fbd37c90df572"
|
|
||||||
url: "https://pub.flutter-io.cn"
|
|
||||||
source: hosted
|
|
||||||
version: "0.17.6"
|
|
||||||
nested:
|
nested:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -795,10 +779,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: objective_c
|
name: objective_c
|
||||||
sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52"
|
sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "9.3.0"
|
version: "9.4.1"
|
||||||
octo_image:
|
octo_image:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -907,10 +891,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_apple
|
name: permission_handler_apple
|
||||||
sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023
|
sha256: e20daf680eef1ca62ffe8c8c526b778cc386d50137c77ac71c8ec9c88c13fb9d
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "9.4.7"
|
version: "9.4.9"
|
||||||
permission_handler_html:
|
permission_handler_html:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1023,6 +1007,14 @@ packages:
|
|||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.3"
|
version: "2.2.3"
|
||||||
|
record_use:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: record_use
|
||||||
|
sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed"
|
||||||
|
url: "https://pub.flutter-io.cn"
|
||||||
|
source: hosted
|
||||||
|
version: "0.6.0"
|
||||||
reorderables:
|
reorderables:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1043,58 +1035,58 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: screen_brightness
|
name: screen_brightness
|
||||||
sha256: "5f70754028f169f059fdc61112a19dcbee152f8b293c42c848317854d650cba3"
|
sha256: "7ea1c037422f007f022dcff3ee955bf8e61a474d5426b29be9290fd976c3e46b"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.7"
|
version: "2.1.9"
|
||||||
screen_brightness_android:
|
screen_brightness_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: screen_brightness_android
|
name: screen_brightness_android
|
||||||
sha256: d34f5321abd03bc3474f4c381f53d189117eba0b039eac1916aa92cca5fd0a96
|
sha256: "0e4b0a07d5f730b91a8780d8436f3a92be8a8cc2066032ed88b93c8fa153fadf"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.3"
|
version: "2.1.5"
|
||||||
screen_brightness_ios:
|
screen_brightness_ios:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: screen_brightness_ios
|
name: screen_brightness_ios
|
||||||
sha256: "2493953340ecfe8f4f13f61db50ce72533a55b0bbd58ba1402893feecf3727f5"
|
sha256: "0792d8f98852558f831b4b75241c46047b884598b3f4d982b37dc2dd43e2b2e1"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.2"
|
version: "2.1.3"
|
||||||
screen_brightness_macos:
|
screen_brightness_macos:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: screen_brightness_macos
|
name: screen_brightness_macos
|
||||||
sha256: "4edf330ad21078686d8bfaf89413325fbaf571dcebe1e89254d675a3f288b5b9"
|
sha256: "278712cf5288db57bd335968cbfb2ec5441028f1ee2fcbdc8d1582d8210a3442"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.1"
|
version: "2.1.2"
|
||||||
screen_brightness_ohos:
|
screen_brightness_ohos:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: screen_brightness_ohos
|
name: screen_brightness_ohos
|
||||||
sha256: a93a263dcd39b5c56e589eb495bcd001ce65cdd96ff12ab1350683559d5c5bb7
|
sha256: "33f495741d5aa53104d3f5875dcb4b6a119f29ef595be17129ee03a5b78e76a9"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.2"
|
version: "2.1.3"
|
||||||
screen_brightness_platform_interface:
|
screen_brightness_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: screen_brightness_platform_interface
|
name: screen_brightness_platform_interface
|
||||||
sha256: "737bd47b57746bc4291cab1b8a5843ee881af499514881b0247ec77447ee769c"
|
sha256: "59d50850d6735d677780fc7359c8e997d0ff6df91c8465161c9e617a7b0a11d8"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.0"
|
version: "2.1.1"
|
||||||
screen_brightness_windows:
|
screen_brightness_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: screen_brightness_windows
|
name: screen_brightness_windows
|
||||||
sha256: d3518bf0f5d7a884cee2c14449ae0b36803802866de09f7ef74077874b6b2448
|
sha256: "121f9dd6d62585bfb4e468c2170804ce4f2a2303ae6b2efc3a065c94937505d7"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.0"
|
version: "2.1.1"
|
||||||
screenshot:
|
screenshot:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1184,10 +1176,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: sqflite
|
name: sqflite
|
||||||
sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03
|
sha256: "564cfed0746fe53140c23b70b308e045c3b31f17778f2f326ccb7d804ea0250a"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.2"
|
version: "2.4.2+1"
|
||||||
sqflite_android:
|
sqflite_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1200,10 +1192,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: sqflite_common
|
name: sqflite_common
|
||||||
sha256: "6ef422a4525ecc601db6c0a2233ff448c731307906e92cabc9ba292afaae16a6"
|
sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.5.6"
|
version: "2.5.8"
|
||||||
sqflite_darwin:
|
sqflite_darwin:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1304,10 +1296,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_android
|
name: url_launcher_android
|
||||||
sha256: "3bb000251e55d4a209aa0e2e563309dc9bb2befea2295fd0cec1f51760aac572"
|
sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.3.29"
|
version: "6.3.30"
|
||||||
url_launcher_ios:
|
url_launcher_ios:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1344,10 +1336,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_web
|
name: url_launcher_web
|
||||||
sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f
|
sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.2"
|
version: "2.4.3"
|
||||||
url_launcher_windows:
|
url_launcher_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1392,18 +1384,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: video_player_avfoundation
|
name: video_player_avfoundation
|
||||||
sha256: af0e5b8a7a4876fb37e7cc8cb2a011e82bb3ecfa45844ef672e32cb14a1f259e
|
sha256: "9338f3ec22774f88146b22f13273a446719b1da010fd200c4d1d97802156ac58"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.9.4"
|
version: "2.9.7"
|
||||||
video_player_platform_interface:
|
video_player_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: video_player_platform_interface
|
name: video_player_platform_interface
|
||||||
sha256: "57c5d73173f76d801129d0531c2774052c5a7c11ccb962f1830630decd9f24ec"
|
sha256: "16eaed5268c571c31840dc58ef8da5f0cd4db2a98490c3b8f1cf70122546c6e0"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.6.0"
|
version: "6.7.0"
|
||||||
video_player_web:
|
video_player_web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1424,10 +1416,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499"
|
sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "15.1.0"
|
version: "15.2.0"
|
||||||
wakelock_plus:
|
wakelock_plus:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1440,10 +1432,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: wakelock_plus_platform_interface
|
name: wakelock_plus_platform_interface
|
||||||
sha256: "24b84143787220a403491c2e5de0877fbbb87baf3f0b18a2a988973863db4b03"
|
sha256: b13f99e992e7ae6a152e16c5559d3c07ff445b13330192662494e614ca3e7d7b
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.4.0"
|
version: "1.5.1"
|
||||||
web:
|
web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1456,10 +1448,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: wechat_assets_picker
|
name: wechat_assets_picker
|
||||||
sha256: "58d15c4369596f62d9c6e4202fc7ccf0b863a1adf7893989d3982df9716eb5e5"
|
sha256: e2e447c12a6254e523b83415deb0b77953a96eafcb4586901b7d93039d2ca9d6
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.1.1"
|
version: "10.1.2"
|
||||||
wechat_picker_library:
|
wechat_picker_library:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -3,4 +3,5 @@ export 'calendarcalendar/custom_calendar_range_picker_widget.dart';
|
|||||||
export 'calendarcalendar/custom_date_picker.dart';
|
export 'calendarcalendar/custom_date_picker.dart';
|
||||||
export 'upload_image/look_images_widget.dart';
|
export 'upload_image/look_images_widget.dart';
|
||||||
export 'upload_image/upload_images_tool.dart';
|
export 'upload_image/upload_images_tool.dart';
|
||||||
|
export 'upload_video/video_batch_upload.dart';
|
||||||
export 'utils/date_utils.dart';
|
export 'utils/date_utils.dart';
|
||||||
|
|||||||
@@ -48,6 +48,10 @@ class HttpUtils {
|
|||||||
name: 'Response Text: ',
|
name: 'Response Text: ',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Map<String, dynamic> map = response.data;
|
||||||
|
if (map.keys.contains('code') && map['code'] == 401) {
|
||||||
|
response.data = {'resultCode': 'UNLOGIN', 'resultMsg': '请重新登录'};
|
||||||
|
}
|
||||||
|
|
||||||
/// 对接口抛出异常的检查
|
/// 对接口抛出异常的检查
|
||||||
_apiVerify(response);
|
_apiVerify(response);
|
||||||
@@ -103,6 +107,12 @@ class HttpUtils {
|
|||||||
// value: response.headers["authorization"]![0]);
|
// value: response.headers["authorization"]![0]);
|
||||||
// }
|
// }
|
||||||
if (isShowLoading) EasyLoading.dismiss();
|
if (isShowLoading) EasyLoading.dismiss();
|
||||||
|
|
||||||
|
///转化结果
|
||||||
|
Map<String, dynamic> map = response.data;
|
||||||
|
if (map.keys.contains('code') && map['code'] == 401) {
|
||||||
|
response.data = {'resultCode': 'FAIL', 'resultMsg': '请重新登录'};
|
||||||
|
}
|
||||||
netResult = NetResult(
|
netResult = NetResult(
|
||||||
headers: response.headers,
|
headers: response.headers,
|
||||||
result: response.data,
|
result: response.data,
|
||||||
@@ -231,7 +241,10 @@ class HttpUtils {
|
|||||||
ToastUtils.showToast(msg: '服务响应超时');
|
ToastUtils.showToast(msg: '服务响应超时');
|
||||||
break;
|
break;
|
||||||
case DioExceptionType.unknown:
|
case DioExceptionType.unknown:
|
||||||
ToastUtils.showToast(msg: error.message);
|
ToastUtils.showToast(
|
||||||
|
msg: (error.message == '' || error.message?.isEmpty == true)
|
||||||
|
? '请重新登录'
|
||||||
|
: error.message);
|
||||||
break;
|
break;
|
||||||
case DioExceptionType.badResponse:
|
case DioExceptionType.badResponse:
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -37,8 +37,15 @@ class UploadOss {
|
|||||||
required String ossHost,
|
required String ossHost,
|
||||||
bool? isShowLoading,
|
bool? isShowLoading,
|
||||||
}) async {
|
}) async {
|
||||||
|
final String normalizedFileType =
|
||||||
|
fileType.toLowerCase() == 'jpeg' ? 'jpg' : fileType.toLowerCase();
|
||||||
|
final bool isVideo = normalizedFileType == 'mp4';
|
||||||
|
final String? imageContentType = isVideo
|
||||||
|
? null
|
||||||
|
: (normalizedFileType == 'jpg' ? 'jpeg' : normalizedFileType);
|
||||||
// 生成oss的路径和文件名我这里目前设置的是moment/20201229/test.mp4
|
// 生成oss的路径和文件名我这里目前设置的是moment/20201229/test.mp4
|
||||||
String pathName = "$rootDir/${getDate()}/app-${getRandom(12)}.$fileType";
|
String pathName =
|
||||||
|
"$rootDir/${getDate()}/app-${getRandom(12)}.$normalizedFileType";
|
||||||
|
|
||||||
// 请求参数的form对象
|
// 请求参数的form对象
|
||||||
FormData formdata = FormData.fromMap({
|
FormData formdata = FormData.fromMap({
|
||||||
@@ -51,8 +58,8 @@ class UploadOss {
|
|||||||
'success_action_status': '200',
|
'success_action_status': '200',
|
||||||
'file': MultipartFile.fromFileSync(
|
'file': MultipartFile.fromFileSync(
|
||||||
path,
|
path,
|
||||||
contentType: fileType == 'mp4' ? null : DioMediaType("image", "jpg"),
|
contentType: isVideo ? null : DioMediaType("image", imageContentType!),
|
||||||
filename: "${getRandom(12)}.$fileType",
|
filename: "${getRandom(12)}.$normalizedFileType",
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
if (isShowLoading == true) {
|
if (isShowLoading == true) {
|
||||||
@@ -71,13 +78,19 @@ class UploadOss {
|
|||||||
ossHost,
|
ossHost,
|
||||||
data: formdata,
|
data: formdata,
|
||||||
options: Options(
|
options: Options(
|
||||||
contentType: "multipart/form-data;image/jpg",
|
contentType: isVideo
|
||||||
headers: {'Content-Type': 'multipart/form-data;image/jpg'},
|
? "multipart/form-data"
|
||||||
|
: "multipart/form-data;image/$imageContentType",
|
||||||
|
headers: {
|
||||||
|
'Content-Type': isVideo
|
||||||
|
? "multipart/form-data"
|
||||||
|
: "multipart/form-data;image/$imageContentType",
|
||||||
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
print("response ===== $response");
|
print("response ===== $response");
|
||||||
EasyLoading.dismiss();
|
EasyLoading.dismiss();
|
||||||
if(fileType == 'jpg'){
|
if (!isVideo && path.contains('compressed_images_')) {
|
||||||
/// 删除临时文件
|
/// 删除临时文件
|
||||||
File(path).deleteSync();
|
File(path).deleteSync();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:math';
|
|
||||||
|
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter_common/upload_image/ossUtil.dart';
|
import 'package:flutter_common/upload_image/ossUtil.dart';
|
||||||
|
import 'package:flutter_common/utils/asset_picker_localization.dart';
|
||||||
import 'package:flutter_image_compress/flutter_image_compress.dart';
|
import 'package:flutter_image_compress/flutter_image_compress.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:image_picker/image_picker.dart';
|
import 'package:image_picker/image_picker.dart';
|
||||||
@@ -12,6 +12,28 @@ import 'package:image_picker/image_picker.dart';
|
|||||||
import 'package:permission_handler/permission_handler.dart';
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
|
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
|
||||||
|
|
||||||
|
class _CompressedImageFile {
|
||||||
|
const _CompressedImageFile({
|
||||||
|
required this.path,
|
||||||
|
required this.fileType,
|
||||||
|
});
|
||||||
|
|
||||||
|
final String path;
|
||||||
|
final String fileType;
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ImageCompressionTarget {
|
||||||
|
const _ImageCompressionTarget({
|
||||||
|
required this.format,
|
||||||
|
required this.extension,
|
||||||
|
required this.fileType,
|
||||||
|
});
|
||||||
|
|
||||||
|
final CompressFormat format;
|
||||||
|
final String extension;
|
||||||
|
final String fileType;
|
||||||
|
}
|
||||||
|
|
||||||
class UploadImagesTool {
|
class UploadImagesTool {
|
||||||
static uploadImagesTool({
|
static uploadImagesTool({
|
||||||
String? oSSAccessKeyId,
|
String? oSSAccessKeyId,
|
||||||
@@ -139,7 +161,9 @@ class UploadImagesTool {
|
|||||||
)
|
)
|
||||||
: CupertinoActionSheet(
|
: CupertinoActionSheet(
|
||||||
title: const Text('上传图片'),
|
title: const Text('上传图片'),
|
||||||
message: (max == null || max == 0) ? null : Text('请选择上传方式\n相册最多${max}张'),
|
message: (max == null || max == 0)
|
||||||
|
? null
|
||||||
|
: Text('请选择上传方式\n相册最多${max}张'),
|
||||||
actions: isAddOtherWidget != null
|
actions: isAddOtherWidget != null
|
||||||
? <Widget>[
|
? <Widget>[
|
||||||
isAddOtherWidget,
|
isAddOtherWidget,
|
||||||
@@ -153,7 +177,8 @@ class UploadImagesTool {
|
|||||||
policy: policy ?? '',
|
policy: policy ?? '',
|
||||||
callback: callback ?? '',
|
callback: callback ?? '',
|
||||||
signature: signature ?? '',
|
signature: signature ?? '',
|
||||||
chooseImages: (list) => chooseImages?.call(list),
|
chooseImages: (list) =>
|
||||||
|
chooseImages?.call(list),
|
||||||
);
|
);
|
||||||
Get.back();
|
Get.back();
|
||||||
},
|
},
|
||||||
@@ -169,7 +194,8 @@ class UploadImagesTool {
|
|||||||
policy: policy ?? '',
|
policy: policy ?? '',
|
||||||
callback: callback ?? '',
|
callback: callback ?? '',
|
||||||
signature: signature ?? '',
|
signature: signature ?? '',
|
||||||
chooseImages: (list) => chooseImages?.call(list),
|
chooseImages: (list) =>
|
||||||
|
chooseImages?.call(list),
|
||||||
);
|
);
|
||||||
Get.back();
|
Get.back();
|
||||||
},
|
},
|
||||||
@@ -186,7 +212,8 @@ class UploadImagesTool {
|
|||||||
policy: policy ?? '',
|
policy: policy ?? '',
|
||||||
callback: callback ?? '',
|
callback: callback ?? '',
|
||||||
signature: signature ?? '',
|
signature: signature ?? '',
|
||||||
chooseImages: (list) => chooseImages?.call(list),
|
chooseImages: (list) =>
|
||||||
|
chooseImages?.call(list),
|
||||||
);
|
);
|
||||||
Get.back();
|
Get.back();
|
||||||
},
|
},
|
||||||
@@ -203,7 +230,8 @@ class UploadImagesTool {
|
|||||||
callback: callback ?? '',
|
callback: callback ?? '',
|
||||||
signature: signature ?? '',
|
signature: signature ?? '',
|
||||||
isShowLoading: isShowLoading,
|
isShowLoading: isShowLoading,
|
||||||
chooseImages: (list) => chooseImages?.call(list),
|
chooseImages: (list) =>
|
||||||
|
chooseImages?.call(list),
|
||||||
);
|
);
|
||||||
Get.back();
|
Get.back();
|
||||||
},
|
},
|
||||||
@@ -231,11 +259,10 @@ class UploadImagesTool {
|
|||||||
String? ossHost,
|
String? ossHost,
|
||||||
}) async {
|
}) async {
|
||||||
XFile? file = await ImagePicker().pickImage(
|
XFile? file = await ImagePicker().pickImage(
|
||||||
source: ImageSource.camera,
|
source: ImageSource.camera,
|
||||||
maxHeight: 1080,
|
maxHeight: 1080,
|
||||||
maxWidth: 1920,
|
maxWidth: 1920,
|
||||||
imageQuality: 80
|
imageQuality: 80);
|
||||||
);
|
|
||||||
if (file == null) {
|
if (file == null) {
|
||||||
Get.back();
|
Get.back();
|
||||||
} else {
|
} else {
|
||||||
@@ -267,7 +294,12 @@ class UploadImagesTool {
|
|||||||
if (isVideo == true) {
|
if (isVideo == true) {
|
||||||
final List<AssetEntity>? result = await AssetPicker.pickAssets(
|
final List<AssetEntity>? result = await AssetPicker.pickAssets(
|
||||||
Get.context!,
|
Get.context!,
|
||||||
pickerConfig: AssetPickerConfig(maxAssets: 1, requestType: RequestType.video),
|
pickerConfig: AssetPickerConfig(
|
||||||
|
maxAssets: 1,
|
||||||
|
requestType: RequestType.video,
|
||||||
|
pathNameBuilder: (AssetPathEntity path) =>
|
||||||
|
AssetPickerLocalization.pathName(Get.context!, path),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
final File? video = await result?.first.file;
|
final File? video = await result?.first.file;
|
||||||
String path = await saveNetworkImgGallery(
|
String path = await saveNetworkImgGallery(
|
||||||
@@ -283,34 +315,38 @@ class UploadImagesTool {
|
|||||||
chooseImages?.call([path]);
|
chooseImages?.call([path]);
|
||||||
} else {
|
} else {
|
||||||
/// 创建临时目录
|
/// 创建临时目录
|
||||||
final Directory tempDir = Directory.systemTemp.createTempSync('compressed_images_');
|
final Directory tempDir =
|
||||||
|
Directory.systemTemp.createTempSync('compressed_images_');
|
||||||
final List<AssetEntity>? result = await AssetPicker.pickAssets(
|
final List<AssetEntity>? result = await AssetPicker.pickAssets(
|
||||||
Get.context!,
|
Get.context!,
|
||||||
pickerConfig: AssetPickerConfig(maxAssets: max ?? 50),
|
pickerConfig: AssetPickerConfig(
|
||||||
|
maxAssets: max ?? 50,
|
||||||
|
pathNameBuilder: (AssetPathEntity path) =>
|
||||||
|
AssetPickerLocalization.pathName(Get.context!, path),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
/// 临时存储选中的图片
|
/// 临时存储选中的图片
|
||||||
final List<XFile> selectedFiles = [];
|
final List<_CompressedImageFile> selectedFiles = [];
|
||||||
if (result != null && result.isNotEmpty) {
|
if (result != null && result.isNotEmpty) {
|
||||||
for (int i = 0; i < result.length; i++) {
|
for (int i = 0; i < result.length; i++) {
|
||||||
final File? file = await result[i].file;
|
final File? file = await result[i].file;
|
||||||
if (file != null) {
|
if (file != null) {
|
||||||
/// 获取文件扩展名
|
final _CompressedImageFile? compressedFile =
|
||||||
final String extension = file.absolute.path.split('.').last;
|
await _compressGalleryImage(file, tempDir);
|
||||||
/// 压缩并保存到临时文件
|
|
||||||
final XFile? compressedFile = await FlutterImageCompress.compressAndGetFile(
|
|
||||||
file.absolute.path, '${tempDir.path}/${DateTime.now().millisecondsSinceEpoch}_compressed.$extension',
|
|
||||||
quality: 80, minWidth: 1920, minHeight: 1080);
|
|
||||||
if (compressedFile != null) {
|
if (compressedFile != null) {
|
||||||
selectedFiles.add(compressedFile);
|
selectedFiles.add(compressedFile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 上传选中的图片
|
/// 上传选中的图片
|
||||||
List<String> list = [];
|
List<String> list = [];
|
||||||
for (var element in selectedFiles) {
|
for (var element in selectedFiles) {
|
||||||
String path = await saveNetworkImgGallery(
|
String path = await saveNetworkImgGallery(
|
||||||
element.path,
|
element.path,
|
||||||
|
fileType: element.fileType,
|
||||||
oSSAccessKeyId: oSSAccessKeyId ?? '',
|
oSSAccessKeyId: oSSAccessKeyId ?? '',
|
||||||
ossHost: ossHost ?? '',
|
ossHost: ossHost ?? '',
|
||||||
ossDirectory: ossDirectory ?? '',
|
ossDirectory: ossDirectory ?? '',
|
||||||
@@ -325,6 +361,99 @@ class UploadImagesTool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Future<_CompressedImageFile?> _compressGalleryImage(
|
||||||
|
File file,
|
||||||
|
Directory tempDir,
|
||||||
|
) async {
|
||||||
|
final _ImageCompressionTarget target =
|
||||||
|
_compressionTargetForPath(file.absolute.path);
|
||||||
|
final XFile? compressedFile = await _compressImageWithTarget(
|
||||||
|
file,
|
||||||
|
tempDir,
|
||||||
|
target,
|
||||||
|
);
|
||||||
|
if (compressedFile != null) {
|
||||||
|
return _CompressedImageFile(
|
||||||
|
path: compressedFile.path,
|
||||||
|
fileType: target.fileType,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target.format == CompressFormat.jpeg) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const _ImageCompressionTarget fallbackTarget = _ImageCompressionTarget(
|
||||||
|
format: CompressFormat.jpeg,
|
||||||
|
extension: 'jpg',
|
||||||
|
fileType: 'jpg',
|
||||||
|
);
|
||||||
|
final XFile? fallbackFile = await _compressImageWithTarget(
|
||||||
|
file,
|
||||||
|
tempDir,
|
||||||
|
fallbackTarget,
|
||||||
|
);
|
||||||
|
if (fallbackFile == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return _CompressedImageFile(
|
||||||
|
path: fallbackFile.path,
|
||||||
|
fileType: fallbackTarget.fileType,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<XFile?> _compressImageWithTarget(
|
||||||
|
File file,
|
||||||
|
Directory tempDir,
|
||||||
|
_ImageCompressionTarget target,
|
||||||
|
) async {
|
||||||
|
try {
|
||||||
|
return await FlutterImageCompress.compressAndGetFile(
|
||||||
|
file.absolute.path,
|
||||||
|
'${tempDir.path}/${DateTime.now().microsecondsSinceEpoch}_compressed.${target.extension}',
|
||||||
|
quality: 80,
|
||||||
|
minWidth: 1920,
|
||||||
|
minHeight: 1080,
|
||||||
|
format: target.format,
|
||||||
|
);
|
||||||
|
} catch (_) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static _ImageCompressionTarget _compressionTargetForPath(String path) {
|
||||||
|
final String extension =
|
||||||
|
path.split('?').first.split('.').last.toLowerCase();
|
||||||
|
switch (extension) {
|
||||||
|
case 'png':
|
||||||
|
return const _ImageCompressionTarget(
|
||||||
|
format: CompressFormat.png,
|
||||||
|
extension: 'png',
|
||||||
|
fileType: 'png',
|
||||||
|
);
|
||||||
|
case 'webp':
|
||||||
|
return const _ImageCompressionTarget(
|
||||||
|
format: CompressFormat.webp,
|
||||||
|
extension: 'webp',
|
||||||
|
fileType: 'webp',
|
||||||
|
);
|
||||||
|
case 'heic':
|
||||||
|
case 'heif':
|
||||||
|
return const _ImageCompressionTarget(
|
||||||
|
format: CompressFormat.heic,
|
||||||
|
extension: 'heic',
|
||||||
|
fileType: 'heic',
|
||||||
|
);
|
||||||
|
case 'jpeg':
|
||||||
|
case 'jpg':
|
||||||
|
default:
|
||||||
|
return const _ImageCompressionTarget(
|
||||||
|
format: CompressFormat.jpeg,
|
||||||
|
extension: 'jpg',
|
||||||
|
fileType: 'jpg',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 保存网络图片
|
// 保存网络图片
|
||||||
static Future<String> saveNetworkImg(
|
static Future<String> saveNetworkImg(
|
||||||
XFile file, {
|
XFile file, {
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
export 'video_batch_upload_config.dart';
|
||||||
|
export 'video_batch_upload_service.dart';
|
||||||
|
export 'video_batch_upload_task.dart';
|
||||||
|
export 'video_batch_uploader.dart';
|
||||||
|
export 'video_batch_upload_widgets.dart';
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
class VideoBatchUploadConfig {
|
||||||
|
const VideoBatchUploadConfig._();
|
||||||
|
|
||||||
|
static const int maxAssets = 9;
|
||||||
|
static const int maxConcurrent = 2;
|
||||||
|
}
|
||||||
@@ -0,0 +1,347 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
|
import 'video_batch_upload_queue.dart';
|
||||||
|
import 'video_batch_upload_task.dart';
|
||||||
|
|
||||||
|
class VideoBatchUploadPanel extends StatelessWidget {
|
||||||
|
const VideoBatchUploadPanel({
|
||||||
|
super.key,
|
||||||
|
required this.queue,
|
||||||
|
});
|
||||||
|
|
||||||
|
final VideoBatchUploadQueue queue;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
if (!queue.hasTasks) {
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
}
|
||||||
|
return Positioned(
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
bottom: 0,
|
||||||
|
child: AnimatedSwitcher(
|
||||||
|
duration: const Duration(milliseconds: 180),
|
||||||
|
child: queue.isExpanded
|
||||||
|
? _ExpandedUploadPanel(queue: queue)
|
||||||
|
: _CollapsedUploadBar(queue: queue),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _CollapsedUploadBar extends StatelessWidget {
|
||||||
|
const _CollapsedUploadBar({required this.queue});
|
||||||
|
|
||||||
|
final VideoBatchUploadQueue queue;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return SafeArea(
|
||||||
|
top: false,
|
||||||
|
child: GestureDetector(
|
||||||
|
onTap: queue.toggleExpanded,
|
||||||
|
child: Container(
|
||||||
|
height: 70.h,
|
||||||
|
margin: EdgeInsets.fromLTRB(24.w, 0, 24.w, 18.h),
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 22.w),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(18.r),
|
||||||
|
boxShadow: <BoxShadow>[
|
||||||
|
BoxShadow(
|
||||||
|
color: Colors.black.withValues(alpha: 0.12),
|
||||||
|
blurRadius: 18.r,
|
||||||
|
offset: Offset(0, 6.h),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Icon(
|
||||||
|
Icons.cloud_upload_outlined,
|
||||||
|
color: const Color(0xFF46A5FF),
|
||||||
|
size: 34.sp,
|
||||||
|
),
|
||||||
|
SizedBox(width: 12.w),
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
'正在上传${queue.assetType.label} ${queue.finishedCount}/${queue.totalCount}',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 24.sp,
|
||||||
|
color: const Color(0xFF1F2937),
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Icon(
|
||||||
|
Icons.keyboard_arrow_up_rounded,
|
||||||
|
color: const Color(0xFF667085),
|
||||||
|
size: 34.sp,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ExpandedUploadPanel extends StatelessWidget {
|
||||||
|
const _ExpandedUploadPanel({required this.queue});
|
||||||
|
|
||||||
|
final VideoBatchUploadQueue queue;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final double bottomPadding = MediaQuery.of(context).padding.bottom;
|
||||||
|
return Container(
|
||||||
|
constraints: BoxConstraints(maxHeight: 560.h),
|
||||||
|
padding: EdgeInsets.fromLTRB(24.w, 20.h, 24.w, 18.h + bottomPadding),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.vertical(top: Radius.circular(24.r)),
|
||||||
|
boxShadow: <BoxShadow>[
|
||||||
|
BoxShadow(
|
||||||
|
color: Colors.black.withValues(alpha: 0.12),
|
||||||
|
blurRadius: 18.r,
|
||||||
|
offset: Offset(0, -6.h),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: <Widget>[
|
||||||
|
Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
'上传${queue.assetType.label}',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 30.sp,
|
||||||
|
color: const Color(0xFF111827),
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'${queue.finishedCount}/${queue.totalCount}',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 24.sp,
|
||||||
|
color: const Color(0xFF667085),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 10.w),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: queue.toggleExpanded,
|
||||||
|
behavior: HitTestBehavior.opaque,
|
||||||
|
child: Icon(
|
||||||
|
Icons.keyboard_arrow_down_rounded,
|
||||||
|
color: const Color(0xFF667085),
|
||||||
|
size: 38.sp,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(height: 16.h),
|
||||||
|
Flexible(
|
||||||
|
child: ListView.separated(
|
||||||
|
padding: EdgeInsets.zero,
|
||||||
|
shrinkWrap: true,
|
||||||
|
itemCount: queue.tasks.length,
|
||||||
|
separatorBuilder: (_, __) => SizedBox(height: 12.h),
|
||||||
|
itemBuilder: (_, int index) {
|
||||||
|
final VideoBatchUploadTask task = queue.tasks[index];
|
||||||
|
return _UploadTaskCell(
|
||||||
|
task: task,
|
||||||
|
onRetry: () => queue.retryTask(task),
|
||||||
|
onRemove: () => queue.removeTask(task),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _UploadTaskCell extends StatelessWidget {
|
||||||
|
const _UploadTaskCell({
|
||||||
|
required this.task,
|
||||||
|
required this.onRetry,
|
||||||
|
required this.onRemove,
|
||||||
|
});
|
||||||
|
|
||||||
|
final VideoBatchUploadTask task;
|
||||||
|
final VoidCallback onRetry;
|
||||||
|
final VoidCallback onRemove;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final Color statusColor = task.status == VideoBatchUploadStatus.failed
|
||||||
|
? const Color(0xFFE5484D)
|
||||||
|
: const Color(0xFF667085);
|
||||||
|
return Container(
|
||||||
|
padding: EdgeInsets.all(12.w),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: const Color(0xFFF7F8FA),
|
||||||
|
borderRadius: BorderRadius.circular(16.r),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
children: <Widget>[
|
||||||
|
ClipRRect(
|
||||||
|
borderRadius: BorderRadius.circular(12.r),
|
||||||
|
child: SizedBox(
|
||||||
|
width: 86.w,
|
||||||
|
height: 86.w,
|
||||||
|
child: task.thumbnail == null
|
||||||
|
? Container(
|
||||||
|
color: const Color(0xFFEDEFF3),
|
||||||
|
alignment: Alignment.center,
|
||||||
|
child: Icon(
|
||||||
|
task.assetType == VideoBatchUploadAssetType.video
|
||||||
|
? Icons.videocam_outlined
|
||||||
|
: Icons.image_outlined,
|
||||||
|
size: 46.sp,
|
||||||
|
color: const Color(0xFF98A2B3),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: Image.memory(
|
||||||
|
task.thumbnail!,
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 14.w),
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
Text(
|
||||||
|
task.fileName,
|
||||||
|
maxLines: 1,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 24.sp,
|
||||||
|
color: const Color(0xFF1F2937),
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 8.h),
|
||||||
|
Text(
|
||||||
|
_subtitle,
|
||||||
|
maxLines: 1,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 20.sp,
|
||||||
|
color: const Color(0xFF8D90A0),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 10.h),
|
||||||
|
ClipRRect(
|
||||||
|
borderRadius: BorderRadius.circular(999),
|
||||||
|
child: LinearProgressIndicator(
|
||||||
|
value: task.progress.clamp(0, 1),
|
||||||
|
minHeight: 6.h,
|
||||||
|
backgroundColor: const Color(0xFFE5E7EB),
|
||||||
|
valueColor: AlwaysStoppedAnimation<Color>(
|
||||||
|
task.status == VideoBatchUploadStatus.failed
|
||||||
|
? const Color(0xFFE5484D)
|
||||||
|
: const Color(0xFF46A5FF),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 12.w),
|
||||||
|
SizedBox(
|
||||||
|
width: 96.w,
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.end,
|
||||||
|
children: <Widget>[
|
||||||
|
Text(
|
||||||
|
task.status == VideoBatchUploadStatus.failed &&
|
||||||
|
task.errorMessage.isNotEmpty
|
||||||
|
? task.errorMessage
|
||||||
|
: task.status.label,
|
||||||
|
maxLines: 1,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
textAlign: TextAlign.right,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 20.sp,
|
||||||
|
color: statusColor,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 12.h),
|
||||||
|
_TaskActionButton(
|
||||||
|
task: task,
|
||||||
|
onRetry: onRetry,
|
||||||
|
onRemove: onRemove,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
String get _subtitle {
|
||||||
|
final List<String> parts = <String>[
|
||||||
|
if (task.durationText.isNotEmpty) task.durationText,
|
||||||
|
if (task.fileSizeText.isNotEmpty) task.fileSizeText,
|
||||||
|
];
|
||||||
|
return parts.isEmpty ? task.assetType.localLabel : parts.join(' · ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _TaskActionButton extends StatelessWidget {
|
||||||
|
const _TaskActionButton({
|
||||||
|
required this.task,
|
||||||
|
required this.onRetry,
|
||||||
|
required this.onRemove,
|
||||||
|
});
|
||||||
|
|
||||||
|
final VideoBatchUploadTask task;
|
||||||
|
final VoidCallback onRetry;
|
||||||
|
final VoidCallback onRemove;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
if (task.canRetry) {
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: onRetry,
|
||||||
|
behavior: HitTestBehavior.opaque,
|
||||||
|
child: Text(
|
||||||
|
'重试',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 22.sp,
|
||||||
|
color: const Color(0xFF46A5FF),
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (task.status == VideoBatchUploadStatus.completed) {
|
||||||
|
return Icon(
|
||||||
|
Icons.check_circle_rounded,
|
||||||
|
size: 30.sp,
|
||||||
|
color: const Color(0xFF12B76A),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: onRemove,
|
||||||
|
behavior: HitTestBehavior.opaque,
|
||||||
|
child: Icon(
|
||||||
|
task.status == VideoBatchUploadStatus.uploading
|
||||||
|
? Icons.close_rounded
|
||||||
|
: Icons.delete_outline_rounded,
|
||||||
|
size: 30.sp,
|
||||||
|
color: const Color(0xFF98A2B3),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,405 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:dio/dio.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:flutter_common/utils/toast_utils.dart';
|
||||||
|
|
||||||
|
import 'video_batch_upload_config.dart';
|
||||||
|
import 'video_batch_upload_service.dart';
|
||||||
|
import 'video_batch_upload_task.dart';
|
||||||
|
|
||||||
|
class VideoBatchUploadQueue {
|
||||||
|
VideoBatchUploadQueue({
|
||||||
|
required this.contextProvider,
|
||||||
|
required this.uploadTask,
|
||||||
|
this.saveTask,
|
||||||
|
this.batchSaveTask,
|
||||||
|
required this.onChanged,
|
||||||
|
this.assetType = VideoBatchUploadAssetType.video,
|
||||||
|
this.onCompleted,
|
||||||
|
this.maxAssets = VideoBatchUploadConfig.maxAssets,
|
||||||
|
this.maxConcurrent = VideoBatchUploadConfig.maxConcurrent,
|
||||||
|
});
|
||||||
|
|
||||||
|
final BuildContext? Function() contextProvider;
|
||||||
|
final VideoBatchUploadUploadTask uploadTask;
|
||||||
|
final VideoBatchUploadSaveTask? saveTask;
|
||||||
|
final VideoBatchUploadBatchSaveTask? batchSaveTask;
|
||||||
|
final VoidCallback onChanged;
|
||||||
|
final VideoBatchUploadAssetType assetType;
|
||||||
|
final FutureOr<void> Function()? onCompleted;
|
||||||
|
final int maxAssets;
|
||||||
|
final int maxConcurrent;
|
||||||
|
|
||||||
|
final List<VideoBatchUploadTask> tasks = <VideoBatchUploadTask>[];
|
||||||
|
int _batchTotalCount = 0;
|
||||||
|
int _completedRemovedCount = 0;
|
||||||
|
bool isExpanded = false;
|
||||||
|
bool _isRunning = false;
|
||||||
|
bool _completionNotified = false;
|
||||||
|
bool _isDisposed = false;
|
||||||
|
|
||||||
|
bool get hasTasks => tasks.isNotEmpty;
|
||||||
|
|
||||||
|
bool get hasActiveUploads => tasks.any((VideoBatchUploadTask task) {
|
||||||
|
return task.isActive;
|
||||||
|
});
|
||||||
|
|
||||||
|
int get totalCount => _batchTotalCount > 0 ? _batchTotalCount : tasks.length;
|
||||||
|
|
||||||
|
int get completedCount => tasks
|
||||||
|
.where((VideoBatchUploadTask task) =>
|
||||||
|
task.status == VideoBatchUploadStatus.completed)
|
||||||
|
.length;
|
||||||
|
|
||||||
|
int get failedCount => tasks
|
||||||
|
.where((VideoBatchUploadTask task) =>
|
||||||
|
task.status == VideoBatchUploadStatus.failed)
|
||||||
|
.length;
|
||||||
|
|
||||||
|
int get finishedCount =>
|
||||||
|
_completedRemovedCount + completedCount + failedCount;
|
||||||
|
|
||||||
|
bool get _usesBatchSave => batchSaveTask != null;
|
||||||
|
|
||||||
|
Future<void> pickAndStart() async {
|
||||||
|
if (hasActiveUploads) {
|
||||||
|
isExpanded = true;
|
||||||
|
_notifyChanged();
|
||||||
|
ToastUtils.showToast(msg: '${assetType.label}正在上传中');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final BuildContext? context = contextProvider();
|
||||||
|
if (context == null || !context.mounted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final List<VideoBatchUploadTask> pickedTasks =
|
||||||
|
await VideoBatchUploadPicker.pickMedia(
|
||||||
|
context,
|
||||||
|
maxAssets: maxAssets,
|
||||||
|
assetType: assetType,
|
||||||
|
);
|
||||||
|
if (pickedTasks.isEmpty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks
|
||||||
|
..clear()
|
||||||
|
..addAll(pickedTasks);
|
||||||
|
_batchTotalCount = pickedTasks.length;
|
||||||
|
_completedRemovedCount = 0;
|
||||||
|
isExpanded = true;
|
||||||
|
_completionNotified = false;
|
||||||
|
_notifyChanged();
|
||||||
|
unawaited(_runQueue());
|
||||||
|
}
|
||||||
|
|
||||||
|
void toggleExpanded() {
|
||||||
|
if (!hasTasks) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
isExpanded = !isExpanded;
|
||||||
|
_notifyChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void retryTask(VideoBatchUploadTask task) {
|
||||||
|
if (!tasks.contains(task) || !task.canRetry) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
task
|
||||||
|
..status = VideoBatchUploadStatus.waiting
|
||||||
|
..progress = 0
|
||||||
|
..uploadUrl = ''
|
||||||
|
..errorMessage = '';
|
||||||
|
_completionNotified = false;
|
||||||
|
isExpanded = true;
|
||||||
|
_notifyChanged();
|
||||||
|
unawaited(_runQueue());
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeTask(VideoBatchUploadTask task) {
|
||||||
|
if (!tasks.contains(task)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
task.cancelToken?.cancel('removed');
|
||||||
|
tasks.remove(task);
|
||||||
|
if (tasks.isEmpty) {
|
||||||
|
isExpanded = false;
|
||||||
|
_resetBatchProgress();
|
||||||
|
}
|
||||||
|
_notifyChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear() {
|
||||||
|
for (final VideoBatchUploadTask task in tasks) {
|
||||||
|
task.cancelToken?.cancel('cleared');
|
||||||
|
}
|
||||||
|
tasks.clear();
|
||||||
|
isExpanded = false;
|
||||||
|
_isRunning = false;
|
||||||
|
_resetBatchProgress();
|
||||||
|
_notifyChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void cancelAll() {
|
||||||
|
for (final VideoBatchUploadTask task in tasks) {
|
||||||
|
task.cancelToken?.cancel('cancelled');
|
||||||
|
}
|
||||||
|
for (final VideoBatchUploadTask task in tasks) {
|
||||||
|
if (task.isActive) {
|
||||||
|
task
|
||||||
|
..status = VideoBatchUploadStatus.failed
|
||||||
|
..errorMessage = '已取消';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_isRunning = false;
|
||||||
|
_notifyChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void requestExit({required VoidCallback onExit}) {
|
||||||
|
if (!hasActiveUploads) {
|
||||||
|
onExit();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ToastUtils.showAlterDialog(
|
||||||
|
titleText: '${assetType.label}还在上传',
|
||||||
|
contentText: '离开会中断本次上传,确定要离开吗?',
|
||||||
|
confirmText: '离开',
|
||||||
|
confirmCallback: () {
|
||||||
|
cancelAll();
|
||||||
|
onExit();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dispose() {
|
||||||
|
_isDisposed = true;
|
||||||
|
for (final VideoBatchUploadTask task in tasks) {
|
||||||
|
task.cancelToken?.cancel('disposed');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _resetBatchProgress() {
|
||||||
|
_batchTotalCount = 0;
|
||||||
|
_completedRemovedCount = 0;
|
||||||
|
_completionNotified = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _runQueue() async {
|
||||||
|
if (_isRunning || _isDisposed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_isRunning = true;
|
||||||
|
final int workerCount = maxConcurrent < 1 ? 1 : maxConcurrent;
|
||||||
|
final List<Future<void>> workers = List<Future<void>>.generate(
|
||||||
|
workerCount,
|
||||||
|
(_) => _uploadWorker(),
|
||||||
|
);
|
||||||
|
await Future.wait(workers);
|
||||||
|
_isRunning = false;
|
||||||
|
await _saveUploadedBatchIfNeeded();
|
||||||
|
await _notifyCompletedIfNeeded();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _uploadWorker() async {
|
||||||
|
while (true) {
|
||||||
|
if (_isDisposed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final VideoBatchUploadTask? task = _nextWaitingTask();
|
||||||
|
if (task == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await _processTask(task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VideoBatchUploadTask? _nextWaitingTask() {
|
||||||
|
for (final VideoBatchUploadTask task in tasks) {
|
||||||
|
if (task.status == VideoBatchUploadStatus.waiting) {
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _processTask(VideoBatchUploadTask task) async {
|
||||||
|
task
|
||||||
|
..status = VideoBatchUploadStatus.uploading
|
||||||
|
..progress = 0
|
||||||
|
..errorMessage = ''
|
||||||
|
..cancelToken = CancelToken();
|
||||||
|
_notifyChanged();
|
||||||
|
|
||||||
|
try {
|
||||||
|
final String uploadUrl = await uploadTask(
|
||||||
|
task,
|
||||||
|
(double progress) {
|
||||||
|
if (!tasks.contains(task)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
task.progress = progress.clamp(0, 1);
|
||||||
|
_notifyChanged();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
if (!tasks.contains(task)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (uploadUrl.trim().isEmpty) {
|
||||||
|
throw Exception('empty upload url');
|
||||||
|
}
|
||||||
|
task
|
||||||
|
..uploadUrl = uploadUrl
|
||||||
|
..progress = 1
|
||||||
|
..status = VideoBatchUploadStatus.uploaded;
|
||||||
|
_notifyChanged();
|
||||||
|
|
||||||
|
if (_usesBatchSave) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
task.status = VideoBatchUploadStatus.saving;
|
||||||
|
_notifyChanged();
|
||||||
|
final bool saved = await saveTask!(task);
|
||||||
|
if (!tasks.contains(task)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (saved) {
|
||||||
|
task.status = VideoBatchUploadStatus.completed;
|
||||||
|
_completedRemovedCount += 1;
|
||||||
|
tasks.remove(task);
|
||||||
|
if (tasks.isEmpty) {
|
||||||
|
isExpanded = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
task
|
||||||
|
..status = VideoBatchUploadStatus.failed
|
||||||
|
..errorMessage = '入库失败';
|
||||||
|
}
|
||||||
|
} on DioException catch (error) {
|
||||||
|
if (!tasks.contains(task)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
task
|
||||||
|
..status = VideoBatchUploadStatus.failed
|
||||||
|
..errorMessage =
|
||||||
|
CancelToken.isCancel(error) ? '已取消' : _networkErrorText(error);
|
||||||
|
} catch (_) {
|
||||||
|
if (!tasks.contains(task)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
task
|
||||||
|
..status = VideoBatchUploadStatus.failed
|
||||||
|
..errorMessage = '上传失败';
|
||||||
|
} finally {
|
||||||
|
task.cancelToken = null;
|
||||||
|
_notifyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _saveUploadedBatchIfNeeded() async {
|
||||||
|
if (!_usesBatchSave || _isDisposed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final List<VideoBatchUploadTask> successfulUploadTasks = tasks
|
||||||
|
.where((VideoBatchUploadTask task) =>
|
||||||
|
task.status == VideoBatchUploadStatus.uploaded)
|
||||||
|
.toList();
|
||||||
|
if (successfulUploadTasks.isEmpty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (final VideoBatchUploadTask task in successfulUploadTasks) {
|
||||||
|
task.status = VideoBatchUploadStatus.saving;
|
||||||
|
}
|
||||||
|
_notifyChanged();
|
||||||
|
|
||||||
|
try {
|
||||||
|
final bool saved = await batchSaveTask!(List<VideoBatchUploadTask>.of(
|
||||||
|
successfulUploadTasks,
|
||||||
|
growable: false,
|
||||||
|
));
|
||||||
|
if (_isDisposed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (saved) {
|
||||||
|
_completedRemovedCount += successfulUploadTasks.length;
|
||||||
|
tasks.removeWhere(successfulUploadTasks.contains);
|
||||||
|
if (tasks.isEmpty) {
|
||||||
|
isExpanded = false;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (final VideoBatchUploadTask task in successfulUploadTasks) {
|
||||||
|
if (tasks.contains(task)) {
|
||||||
|
task
|
||||||
|
..status = VideoBatchUploadStatus.failed
|
||||||
|
..errorMessage = '入库失败';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (_) {
|
||||||
|
if (_isDisposed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (final VideoBatchUploadTask task in successfulUploadTasks) {
|
||||||
|
if (tasks.contains(task)) {
|
||||||
|
task
|
||||||
|
..status = VideoBatchUploadStatus.failed
|
||||||
|
..errorMessage = '入库失败';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
_notifyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String _networkErrorText(DioException error) {
|
||||||
|
switch (error.type) {
|
||||||
|
case DioExceptionType.connectionTimeout:
|
||||||
|
case DioExceptionType.sendTimeout:
|
||||||
|
case DioExceptionType.receiveTimeout:
|
||||||
|
case DioExceptionType.connectionError:
|
||||||
|
return '网络异常';
|
||||||
|
case DioExceptionType.cancel:
|
||||||
|
return '已取消';
|
||||||
|
case DioExceptionType.badResponse:
|
||||||
|
return '上传失败';
|
||||||
|
case DioExceptionType.badCertificate:
|
||||||
|
case DioExceptionType.unknown:
|
||||||
|
return '上传失败';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _notifyCompletedIfNeeded() async {
|
||||||
|
if (_isDisposed ||
|
||||||
|
_completionNotified ||
|
||||||
|
totalCount == 0 ||
|
||||||
|
hasActiveUploads) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_completionNotified = true;
|
||||||
|
await onCompleted?.call();
|
||||||
|
if (failedCount > 0) {
|
||||||
|
ToastUtils.showToast(
|
||||||
|
msg:
|
||||||
|
'已上传 $_completedRemovedCount ${assetType.unit},失败 $failedCount ${assetType.unit}');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final int completed = _completedRemovedCount;
|
||||||
|
ToastUtils.showToast(
|
||||||
|
msg: '已上传 $completed ${assetType.unit}${assetType.label}');
|
||||||
|
tasks.clear();
|
||||||
|
isExpanded = false;
|
||||||
|
_resetBatchProgress();
|
||||||
|
_notifyChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _notifyChanged() {
|
||||||
|
if (_isDisposed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
onChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:flutter_common/utils/asset_picker_localization.dart';
|
||||||
|
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
|
||||||
|
|
||||||
|
import 'video_batch_upload_config.dart';
|
||||||
|
import 'video_batch_upload_task.dart';
|
||||||
|
|
||||||
|
class VideoBatchUploadPicker {
|
||||||
|
const VideoBatchUploadPicker._();
|
||||||
|
|
||||||
|
static Future<List<VideoBatchUploadTask>> pickVideos(
|
||||||
|
BuildContext context, {
|
||||||
|
int maxAssets = VideoBatchUploadConfig.maxAssets,
|
||||||
|
}) async {
|
||||||
|
return pickMedia(
|
||||||
|
context,
|
||||||
|
maxAssets: maxAssets,
|
||||||
|
assetType: VideoBatchUploadAssetType.video,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<List<VideoBatchUploadTask>> pickImages(
|
||||||
|
BuildContext context, {
|
||||||
|
int maxAssets = VideoBatchUploadConfig.maxAssets,
|
||||||
|
}) async {
|
||||||
|
return pickMedia(
|
||||||
|
context,
|
||||||
|
maxAssets: maxAssets,
|
||||||
|
assetType: VideoBatchUploadAssetType.image,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<List<VideoBatchUploadTask>> pickMedia(
|
||||||
|
BuildContext context, {
|
||||||
|
int maxAssets = VideoBatchUploadConfig.maxAssets,
|
||||||
|
VideoBatchUploadAssetType assetType = VideoBatchUploadAssetType.video,
|
||||||
|
}) async {
|
||||||
|
final List<AssetEntity>? assets = await AssetPicker.pickAssets(
|
||||||
|
context,
|
||||||
|
pickerConfig: AssetPickerConfig(
|
||||||
|
maxAssets: maxAssets,
|
||||||
|
requestType: _requestType(assetType),
|
||||||
|
pathNameBuilder: (AssetPathEntity path) =>
|
||||||
|
AssetPickerLocalization.pathName(context, path),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
if (assets == null || assets.isEmpty) {
|
||||||
|
return <VideoBatchUploadTask>[];
|
||||||
|
}
|
||||||
|
|
||||||
|
final List<VideoBatchUploadTask> tasks = <VideoBatchUploadTask>[];
|
||||||
|
for (final AssetEntity asset in assets) {
|
||||||
|
final File? file = await asset.file;
|
||||||
|
if (file == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final Uint8List? thumbnail = await asset.thumbnailDataWithSize(
|
||||||
|
const ThumbnailSize.square(220),
|
||||||
|
quality: 72,
|
||||||
|
);
|
||||||
|
final int fileSize = await file.length();
|
||||||
|
tasks.add(
|
||||||
|
VideoBatchUploadTask(
|
||||||
|
id: '${asset.id}_${DateTime.now().microsecondsSinceEpoch}',
|
||||||
|
assetType: assetType,
|
||||||
|
file: file,
|
||||||
|
fileName: _normalizeFileName(asset.title, file.path, assetType),
|
||||||
|
fileSize: fileSize,
|
||||||
|
duration:
|
||||||
|
assetType == VideoBatchUploadAssetType.video ? asset.duration : 0,
|
||||||
|
thumbnail: thumbnail,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return tasks;
|
||||||
|
}
|
||||||
|
|
||||||
|
static RequestType _requestType(VideoBatchUploadAssetType assetType) {
|
||||||
|
switch (assetType) {
|
||||||
|
case VideoBatchUploadAssetType.image:
|
||||||
|
return RequestType.image;
|
||||||
|
case VideoBatchUploadAssetType.video:
|
||||||
|
return RequestType.video;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static String _normalizeFileName(
|
||||||
|
String? assetTitle,
|
||||||
|
String path,
|
||||||
|
VideoBatchUploadAssetType assetType,
|
||||||
|
) {
|
||||||
|
final String title = (assetTitle ?? '').trim();
|
||||||
|
if (title.isNotEmpty) {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
final List<String> segments = path.split(Platform.pathSeparator);
|
||||||
|
final String fileName = segments.isEmpty ? '' : segments.last.trim();
|
||||||
|
return fileName.isEmpty ? assetType.defaultFileName : fileName;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
import 'package:dio/dio.dart';
|
||||||
|
|
||||||
|
typedef VideoBatchUploadProgressCallback = void Function(double progress);
|
||||||
|
|
||||||
|
typedef VideoBatchUploadUploadTask = Future<String> Function(
|
||||||
|
VideoBatchUploadTask task,
|
||||||
|
VideoBatchUploadProgressCallback onProgress,
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef VideoBatchUploadSaveTask = Future<bool> Function(
|
||||||
|
VideoBatchUploadTask task,
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef VideoBatchUploadBatchSaveTask = Future<bool> Function(
|
||||||
|
List<VideoBatchUploadTask> tasks,
|
||||||
|
);
|
||||||
|
|
||||||
|
enum VideoBatchUploadAssetType {
|
||||||
|
image,
|
||||||
|
video,
|
||||||
|
}
|
||||||
|
|
||||||
|
extension VideoBatchUploadAssetTypeText on VideoBatchUploadAssetType {
|
||||||
|
String get label {
|
||||||
|
switch (this) {
|
||||||
|
case VideoBatchUploadAssetType.image:
|
||||||
|
return '图片';
|
||||||
|
case VideoBatchUploadAssetType.video:
|
||||||
|
return '视频';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String get unit {
|
||||||
|
switch (this) {
|
||||||
|
case VideoBatchUploadAssetType.image:
|
||||||
|
return '张';
|
||||||
|
case VideoBatchUploadAssetType.video:
|
||||||
|
return '个';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String get localLabel {
|
||||||
|
switch (this) {
|
||||||
|
case VideoBatchUploadAssetType.image:
|
||||||
|
return '本地图片';
|
||||||
|
case VideoBatchUploadAssetType.video:
|
||||||
|
return '本地视频';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String get defaultFileName {
|
||||||
|
switch (this) {
|
||||||
|
case VideoBatchUploadAssetType.image:
|
||||||
|
return 'image.jpg';
|
||||||
|
case VideoBatchUploadAssetType.video:
|
||||||
|
return 'video.mp4';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum VideoBatchUploadStatus {
|
||||||
|
waiting,
|
||||||
|
uploading,
|
||||||
|
uploaded,
|
||||||
|
saving,
|
||||||
|
completed,
|
||||||
|
failed,
|
||||||
|
}
|
||||||
|
|
||||||
|
extension VideoBatchUploadStatusText on VideoBatchUploadStatus {
|
||||||
|
String get label {
|
||||||
|
switch (this) {
|
||||||
|
case VideoBatchUploadStatus.waiting:
|
||||||
|
return '等待中';
|
||||||
|
case VideoBatchUploadStatus.uploading:
|
||||||
|
return '上传中';
|
||||||
|
case VideoBatchUploadStatus.uploaded:
|
||||||
|
return '上传成功';
|
||||||
|
case VideoBatchUploadStatus.saving:
|
||||||
|
return '入库中';
|
||||||
|
case VideoBatchUploadStatus.completed:
|
||||||
|
return '已完成';
|
||||||
|
case VideoBatchUploadStatus.failed:
|
||||||
|
return '失败';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class VideoBatchUploadTask {
|
||||||
|
VideoBatchUploadTask({
|
||||||
|
required this.id,
|
||||||
|
this.assetType = VideoBatchUploadAssetType.video,
|
||||||
|
required this.file,
|
||||||
|
required this.fileName,
|
||||||
|
required this.fileSize,
|
||||||
|
required this.duration,
|
||||||
|
this.thumbnail,
|
||||||
|
});
|
||||||
|
|
||||||
|
final String id;
|
||||||
|
final VideoBatchUploadAssetType assetType;
|
||||||
|
final File file;
|
||||||
|
final String fileName;
|
||||||
|
final int fileSize;
|
||||||
|
final int duration;
|
||||||
|
final Uint8List? thumbnail;
|
||||||
|
|
||||||
|
VideoBatchUploadStatus status = VideoBatchUploadStatus.waiting;
|
||||||
|
double progress = 0;
|
||||||
|
String uploadUrl = '';
|
||||||
|
String errorMessage = '';
|
||||||
|
CancelToken? cancelToken;
|
||||||
|
|
||||||
|
String get ossUrl => uploadUrl;
|
||||||
|
|
||||||
|
set ossUrl(String value) {
|
||||||
|
uploadUrl = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool get isActive =>
|
||||||
|
status == VideoBatchUploadStatus.waiting ||
|
||||||
|
status == VideoBatchUploadStatus.uploading ||
|
||||||
|
status == VideoBatchUploadStatus.uploaded ||
|
||||||
|
status == VideoBatchUploadStatus.saving;
|
||||||
|
|
||||||
|
bool get canRetry => status == VideoBatchUploadStatus.failed;
|
||||||
|
|
||||||
|
bool get canRemove =>
|
||||||
|
status == VideoBatchUploadStatus.waiting ||
|
||||||
|
status == VideoBatchUploadStatus.completed ||
|
||||||
|
status == VideoBatchUploadStatus.failed;
|
||||||
|
|
||||||
|
String get fileSizeText {
|
||||||
|
if (fileSize <= 0) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
final double mb = fileSize / 1024 / 1024;
|
||||||
|
if (mb >= 1) {
|
||||||
|
return '${mb.toStringAsFixed(1)}MB';
|
||||||
|
}
|
||||||
|
final double kb = fileSize / 1024;
|
||||||
|
return '${kb.toStringAsFixed(0)}KB';
|
||||||
|
}
|
||||||
|
|
||||||
|
String get durationText {
|
||||||
|
if (duration <= 0) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
final int minutes = duration ~/ 60;
|
||||||
|
final int seconds = duration % 60;
|
||||||
|
return '${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}';
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toVideoPayload({
|
||||||
|
String urlKey = 'fileURL',
|
||||||
|
String fileNameKey = 'fileName',
|
||||||
|
String durationKey = 'duration',
|
||||||
|
}) {
|
||||||
|
return <String, dynamic>{
|
||||||
|
urlKey: uploadUrl,
|
||||||
|
fileNameKey: fileName,
|
||||||
|
if (duration > 0) durationKey: duration,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toLibraryVideoPayload() {
|
||||||
|
return toVideoPayload();
|
||||||
|
}
|
||||||
|
|
||||||
|
String toLibraryImageURL() {
|
||||||
|
return uploadUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
|
import 'video_batch_upload_task.dart';
|
||||||
|
|
||||||
|
class VideoBatchUploadBackButton extends StatelessWidget {
|
||||||
|
const VideoBatchUploadBackButton({
|
||||||
|
super.key,
|
||||||
|
required this.onTap,
|
||||||
|
this.iconSize = 19,
|
||||||
|
});
|
||||||
|
|
||||||
|
final VoidCallback onTap;
|
||||||
|
final double iconSize;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return IconButton(
|
||||||
|
onPressed: onTap,
|
||||||
|
icon: Icon(
|
||||||
|
Icons.arrow_back_ios_new,
|
||||||
|
color: Colors.black,
|
||||||
|
size: iconSize,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class VideoBatchUploadIconButton extends StatelessWidget {
|
||||||
|
const VideoBatchUploadIconButton({
|
||||||
|
super.key,
|
||||||
|
required this.onTap,
|
||||||
|
this.assetType = VideoBatchUploadAssetType.video,
|
||||||
|
this.iconSize,
|
||||||
|
this.rightPadding,
|
||||||
|
});
|
||||||
|
|
||||||
|
final VoidCallback onTap;
|
||||||
|
final VideoBatchUploadAssetType assetType;
|
||||||
|
final double? iconSize;
|
||||||
|
final double? rightPadding;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: onTap,
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.only(right: rightPadding ?? 30.w),
|
||||||
|
child: Icon(
|
||||||
|
assetType == VideoBatchUploadAssetType.video
|
||||||
|
? Icons.video_call_outlined
|
||||||
|
: Icons.add_photo_alternate_outlined,
|
||||||
|
size: iconSize ?? 50.sp,
|
||||||
|
color: const Color(0xFF1D1D21),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class VideoBatchUploadEmptyPlaceholder extends StatelessWidget {
|
||||||
|
const VideoBatchUploadEmptyPlaceholder({
|
||||||
|
super.key,
|
||||||
|
this.title = '这个视频库里还没有视频',
|
||||||
|
});
|
||||||
|
|
||||||
|
final String title;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Center(
|
||||||
|
child: Text(
|
||||||
|
title,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 28.sp,
|
||||||
|
color: const Color(0xFF8D90A0),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
|
import 'video_batch_upload_config.dart';
|
||||||
|
import 'video_batch_upload_panel.dart';
|
||||||
|
import 'video_batch_upload_queue.dart';
|
||||||
|
import 'video_batch_upload_task.dart';
|
||||||
|
|
||||||
|
typedef VideoBatchUploadCallback = FutureOr<void> Function();
|
||||||
|
|
||||||
|
class VideoBatchUploader {
|
||||||
|
VideoBatchUploader({
|
||||||
|
required BuildContext? Function() contextProvider,
|
||||||
|
required VideoBatchUploadUploadTask uploadTask,
|
||||||
|
VideoBatchUploadSaveTask? saveTask,
|
||||||
|
VideoBatchUploadBatchSaveTask? batchSaveTask,
|
||||||
|
VideoBatchUploadAssetType assetType = VideoBatchUploadAssetType.video,
|
||||||
|
VoidCallback? onChanged,
|
||||||
|
VideoBatchUploadCallback? onCompleted,
|
||||||
|
int? maxAssets,
|
||||||
|
int? maxConcurrent,
|
||||||
|
}) : assert(saveTask != null || batchSaveTask != null),
|
||||||
|
_contextProvider = contextProvider,
|
||||||
|
_onChanged = onChanged {
|
||||||
|
queue = VideoBatchUploadQueue(
|
||||||
|
contextProvider: contextProvider,
|
||||||
|
uploadTask: uploadTask,
|
||||||
|
saveTask: saveTask,
|
||||||
|
batchSaveTask: batchSaveTask,
|
||||||
|
onChanged: _handleChanged,
|
||||||
|
assetType: assetType,
|
||||||
|
onCompleted: onCompleted,
|
||||||
|
maxAssets: maxAssets ?? VideoBatchUploadConfig.maxAssets,
|
||||||
|
maxConcurrent: maxConcurrent ?? VideoBatchUploadConfig.maxConcurrent,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
final BuildContext? Function() _contextProvider;
|
||||||
|
final VoidCallback? _onChanged;
|
||||||
|
late final VideoBatchUploadQueue queue;
|
||||||
|
OverlayEntry? _overlayEntry;
|
||||||
|
|
||||||
|
bool get hasActiveUploads => queue.hasActiveUploads;
|
||||||
|
|
||||||
|
Future<void> start() async {
|
||||||
|
await queue.pickAndStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
void requestExit({required VoidCallback onExit}) {
|
||||||
|
queue.requestExit(onExit: onExit);
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear() {
|
||||||
|
queue.clear();
|
||||||
|
_syncOverlay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void dispose() {
|
||||||
|
queue.dispose();
|
||||||
|
_removeOverlay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _handleChanged() {
|
||||||
|
_syncOverlay();
|
||||||
|
_overlayEntry?.markNeedsBuild();
|
||||||
|
_onChanged?.call();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _syncOverlay() {
|
||||||
|
if (queue.hasTasks) {
|
||||||
|
_insertOverlayIfNeeded();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_removeOverlay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _insertOverlayIfNeeded() {
|
||||||
|
if (_overlayEntry != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final BuildContext? context = _contextProvider();
|
||||||
|
if (context == null || !context.mounted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final OverlayState? overlay = Overlay.maybeOf(context);
|
||||||
|
if (overlay == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_overlayEntry = OverlayEntry(
|
||||||
|
builder: (_) => VideoBatchUploadPanel(queue: queue),
|
||||||
|
);
|
||||||
|
overlay.insert(_overlayEntry!);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _removeOverlay() {
|
||||||
|
_overlayEntry?.remove();
|
||||||
|
_overlayEntry = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,243 @@
|
|||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
|
||||||
|
|
||||||
|
abstract final class AssetPickerLocalization {
|
||||||
|
static final RegExp _separatorPattern = RegExp(r'[._-]+');
|
||||||
|
static final RegExp _whitespacePattern = RegExp(r'\s+');
|
||||||
|
|
||||||
|
static const Map<String, String> _systemPathNames = <String, String>{
|
||||||
|
'recent': '最近项目',
|
||||||
|
'recents': '最近项目',
|
||||||
|
'all': '全部',
|
||||||
|
'all photos': '所有照片',
|
||||||
|
'all images': '所有图片',
|
||||||
|
'all videos': '所有视频',
|
||||||
|
'camera': '相机',
|
||||||
|
'camera roll': '相机胶卷',
|
||||||
|
'dcim': '相机',
|
||||||
|
'screenshot': '截屏',
|
||||||
|
'screenshots': '截屏',
|
||||||
|
'screen shot': '截屏',
|
||||||
|
'screen shots': '截屏',
|
||||||
|
'screen recording': '屏幕录制',
|
||||||
|
'screen recordings': '屏幕录制',
|
||||||
|
'screen recorder': '屏幕录制',
|
||||||
|
'recordings': '录制内容',
|
||||||
|
'recording': '录制内容',
|
||||||
|
'pictures': '图片',
|
||||||
|
'picture': '图片',
|
||||||
|
'images': '图片',
|
||||||
|
'image': '图片',
|
||||||
|
'photos': '照片',
|
||||||
|
'photo': '照片',
|
||||||
|
'videos': '视频',
|
||||||
|
'video': '视频',
|
||||||
|
'movies': '影片',
|
||||||
|
'movie': '影片',
|
||||||
|
'downloads': '下载',
|
||||||
|
'download': '下载',
|
||||||
|
'documents': '文档',
|
||||||
|
'document': '文档',
|
||||||
|
'saved pictures': '已保存的图片',
|
||||||
|
'saved images': '已保存的图片',
|
||||||
|
'saved photos': '已保存的照片',
|
||||||
|
'edited': '已编辑',
|
||||||
|
'edited photos': '已编辑照片',
|
||||||
|
'edited images': '已编辑图片',
|
||||||
|
'cropped': '已裁剪',
|
||||||
|
'cropped images': '已裁剪图片',
|
||||||
|
'collage': '拼图',
|
||||||
|
'collages': '拼图',
|
||||||
|
'restored': '已恢复',
|
||||||
|
'favorites': '收藏',
|
||||||
|
'favourites': '收藏',
|
||||||
|
'favorite': '收藏',
|
||||||
|
'favourite': '收藏',
|
||||||
|
'hidden': '已隐藏',
|
||||||
|
'trash': '回收站',
|
||||||
|
'recycle bin': '回收站',
|
||||||
|
'recently deleted': '最近删除',
|
||||||
|
'panorama': '全景照片',
|
||||||
|
'panoramas': '全景照片',
|
||||||
|
'portrait': '人像',
|
||||||
|
'portraits': '人像',
|
||||||
|
'selfie': '自拍',
|
||||||
|
'selfies': '自拍',
|
||||||
|
'live photo': '实况照片',
|
||||||
|
'live photos': '实况照片',
|
||||||
|
'raw': 'RAW 照片',
|
||||||
|
'raw photos': 'RAW 照片',
|
||||||
|
'gif': '动图',
|
||||||
|
'gifs': '动图',
|
||||||
|
'animated': '动图',
|
||||||
|
'animated images': '动图',
|
||||||
|
'burst': '连拍快照',
|
||||||
|
'bursts': '连拍快照',
|
||||||
|
'slow motion': '慢动作',
|
||||||
|
'slo mo': '慢动作',
|
||||||
|
'time lapse': '延时摄影',
|
||||||
|
'long screenshot': '长截屏',
|
||||||
|
'long screenshots': '长截屏',
|
||||||
|
'wallpaper': '壁纸',
|
||||||
|
'wallpapers': '壁纸',
|
||||||
|
'bluetooth': '蓝牙',
|
||||||
|
'nearby share': '附近分享',
|
||||||
|
'received files': '接收的文件',
|
||||||
|
'scanner': '扫描件',
|
||||||
|
'scans': '扫描件',
|
||||||
|
'mishare': '小米互传',
|
||||||
|
'huawei share': '华为分享',
|
||||||
|
'honor share': '荣耀分享',
|
||||||
|
'shareit': '茄子快传',
|
||||||
|
};
|
||||||
|
|
||||||
|
static const Map<String, String> _appPathNames = <String, String>{
|
||||||
|
'facebook messenger': 'Messenger',
|
||||||
|
'photoshop express': 'Photoshop Express',
|
||||||
|
'baidu netdisk': '百度网盘',
|
||||||
|
'baidunetdisk': '百度网盘',
|
||||||
|
'tencent qq': 'QQ',
|
||||||
|
'qqfile recv': 'QQ 接收文件',
|
||||||
|
'micro msg': '微信',
|
||||||
|
'micromsg': '微信',
|
||||||
|
'com tencent mm': '微信',
|
||||||
|
'wei xin': '微信',
|
||||||
|
'weixin': '微信',
|
||||||
|
'wechat': '微信',
|
||||||
|
'wechat work': '企业微信',
|
||||||
|
'wecom': '企业微信',
|
||||||
|
'wework': '企业微信',
|
||||||
|
'wxwork': '企业微信',
|
||||||
|
'qq': 'QQ',
|
||||||
|
'dingtalk': '钉钉',
|
||||||
|
'ding talk': '钉钉',
|
||||||
|
'feishu': '飞书',
|
||||||
|
'lark': '飞书',
|
||||||
|
'sina weibo': '微博',
|
||||||
|
'weibo': '微博',
|
||||||
|
'douyin': '抖音',
|
||||||
|
'aweme': '抖音',
|
||||||
|
'tiktok': 'TikTok',
|
||||||
|
'kuaishou': '快手',
|
||||||
|
'kwai': '快手',
|
||||||
|
'xiaohongshu': '小红书',
|
||||||
|
'xhs': '小红书',
|
||||||
|
'red': '小红书',
|
||||||
|
'bilibili': '哔哩哔哩',
|
||||||
|
'zhihu': '知乎',
|
||||||
|
'baidu': '百度',
|
||||||
|
'alipay': '支付宝',
|
||||||
|
'taobao': '淘宝',
|
||||||
|
'tmall': '天猫',
|
||||||
|
'jingdong': '京东',
|
||||||
|
'jd': '京东',
|
||||||
|
'wps': 'WPS',
|
||||||
|
'ucdownloads': 'UC 下载',
|
||||||
|
'qqbrowser': 'QQ 浏览器',
|
||||||
|
'quark': '夸克',
|
||||||
|
'netdisk': '网盘',
|
||||||
|
'whatsapp': 'WhatsApp',
|
||||||
|
'whatsapp business': 'WhatsApp Business',
|
||||||
|
'telegram': 'Telegram',
|
||||||
|
'instagram': 'Instagram',
|
||||||
|
'facebook': 'Facebook',
|
||||||
|
'messenger': 'Messenger',
|
||||||
|
'twitter': 'Twitter',
|
||||||
|
'snapchat': 'Snapchat',
|
||||||
|
'line': 'LINE',
|
||||||
|
'discord': 'Discord',
|
||||||
|
'reddit': 'Reddit',
|
||||||
|
'pinterest': 'Pinterest',
|
||||||
|
'signal': 'Signal',
|
||||||
|
'viber': 'Viber',
|
||||||
|
'capcut': '剪映',
|
||||||
|
'jianying': '剪映',
|
||||||
|
'meitu': '美图',
|
||||||
|
'picsart': 'PicsArt',
|
||||||
|
'canva': 'Canva',
|
||||||
|
'lightroom': 'Lightroom',
|
||||||
|
'inshot': 'InShot',
|
||||||
|
'kinemaster': 'KineMaster',
|
||||||
|
'google photos': 'Google 相册',
|
||||||
|
'onedrive': 'OneDrive',
|
||||||
|
'dropbox': 'Dropbox',
|
||||||
|
};
|
||||||
|
|
||||||
|
static const Map<String, String> _mediaSuffixNames = <String, String>{
|
||||||
|
'image': '图片',
|
||||||
|
'images': '图片',
|
||||||
|
'picture': '图片',
|
||||||
|
'pictures': '图片',
|
||||||
|
'photo': '照片',
|
||||||
|
'photos': '照片',
|
||||||
|
'video': '视频',
|
||||||
|
'videos': '视频',
|
||||||
|
'movie': '影片',
|
||||||
|
'movies': '影片',
|
||||||
|
'audio': '音频',
|
||||||
|
'audios': '音频',
|
||||||
|
'music': '音乐',
|
||||||
|
'document': '文档',
|
||||||
|
'documents': '文档',
|
||||||
|
'doc': '文档',
|
||||||
|
'docs': '文档',
|
||||||
|
'file': '文件',
|
||||||
|
'files': '文件',
|
||||||
|
'download': '下载',
|
||||||
|
'downloads': '下载',
|
||||||
|
'received': '接收文件',
|
||||||
|
'received files': '接收文件',
|
||||||
|
'animated gif': '动图',
|
||||||
|
'animated gifs': '动图',
|
||||||
|
'gif': '动图',
|
||||||
|
'gifs': '动图',
|
||||||
|
};
|
||||||
|
|
||||||
|
static String pathName(
|
||||||
|
BuildContext context,
|
||||||
|
AssetPathEntity path,
|
||||||
|
) {
|
||||||
|
final Locale locale = Localizations.maybeLocaleOf(context) ??
|
||||||
|
WidgetsBinding.instance.platformDispatcher.locale;
|
||||||
|
return pathNameForLocale(locale, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
static String pathNameForLocale(Locale locale, AssetPathEntity path) {
|
||||||
|
if (locale.languageCode.toLowerCase() != 'zh') {
|
||||||
|
return path.name;
|
||||||
|
}
|
||||||
|
if (path.isAll) {
|
||||||
|
return '最近项目';
|
||||||
|
}
|
||||||
|
|
||||||
|
final String normalizedName = _normalize(path.name);
|
||||||
|
final String? systemName = _systemPathNames[normalizedName];
|
||||||
|
if (systemName != null) {
|
||||||
|
return systemName;
|
||||||
|
}
|
||||||
|
final String? appName = _appPathNames[normalizedName];
|
||||||
|
if (appName != null) {
|
||||||
|
return appName;
|
||||||
|
}
|
||||||
|
for (final MapEntry<String, String> app in _appPathNames.entries) {
|
||||||
|
final String prefix = '${app.key} ';
|
||||||
|
if (!normalizedName.startsWith(prefix)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final String suffix = normalizedName.substring(prefix.length);
|
||||||
|
final String? translatedSuffix = _mediaSuffixNames[suffix];
|
||||||
|
if (translatedSuffix != null) {
|
||||||
|
return '${app.value} $translatedSuffix';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return path.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
static String _normalize(String name) {
|
||||||
|
return name
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.replaceAll(_separatorPattern, ' ')
|
||||||
|
.replaceAll(_whitespacePattern, ' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
+13
-4
@@ -97,15 +97,24 @@ class CustomerImagesNetworking extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
String sizeParams = '';
|
String sizeParams = '';
|
||||||
|
const defaultResizeSize = 2048;
|
||||||
if (height != null && width != null) {
|
if (height != null && width != null) {
|
||||||
final h = height!.toInt() <= 1080 ? 1080 : height!.toInt();
|
final h = height!.toInt() <= defaultResizeSize
|
||||||
final w = width!.toInt() <= 1080 ? 1080 : width!.toInt();
|
? defaultResizeSize
|
||||||
|
: height!.toInt();
|
||||||
|
final w = width!.toInt() <= defaultResizeSize
|
||||||
|
? defaultResizeSize
|
||||||
|
: width!.toInt();
|
||||||
sizeParams = 'x-oss-process=image/resize,h_$h,w_$w';
|
sizeParams = 'x-oss-process=image/resize,h_$h,w_$w';
|
||||||
} else if (width != null) {
|
} else if (width != null) {
|
||||||
final w = width!.toInt() <= 1080 ? 1080 : width!.toInt();
|
final w = width!.toInt() <= defaultResizeSize
|
||||||
|
? defaultResizeSize
|
||||||
|
: width!.toInt();
|
||||||
sizeParams = 'x-oss-process=image/resize,h_$w,w_$w';
|
sizeParams = 'x-oss-process=image/resize,h_$w,w_$w';
|
||||||
} else if (height != null) {
|
} else if (height != null) {
|
||||||
final h = height!.toInt() <= 1080 ? 1080 : height!.toInt();
|
final h = height!.toInt() <= defaultResizeSize
|
||||||
|
? defaultResizeSize
|
||||||
|
: height!.toInt();
|
||||||
sizeParams = 'x-oss-process=image/resize,h_$h,w_$h';
|
sizeParams = 'x-oss-process=image/resize,h_$h,w_$h';
|
||||||
}
|
}
|
||||||
final separator = imageUrl.contains('?') ? '&' : '?';
|
final separator = imageUrl.contains('?') ? '&' : '?';
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:flutter_common/utils/asset_picker_localization.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
AssetPathEntity path(String name, {bool isAll = false}) {
|
||||||
|
return AssetPathEntity(id: name, name: name, isAll: isAll);
|
||||||
|
}
|
||||||
|
|
||||||
|
test('localizes the Android all-assets path', () {
|
||||||
|
expect(
|
||||||
|
AssetPickerLocalization.pathNameForLocale(
|
||||||
|
const Locale('zh', 'CN'),
|
||||||
|
path('Recent', isAll: true),
|
||||||
|
),
|
||||||
|
'最近项目',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('localizes common system albums', () {
|
||||||
|
expect(
|
||||||
|
AssetPickerLocalization.pathNameForLocale(
|
||||||
|
const Locale('zh', 'CN'),
|
||||||
|
path('screen_recordings'),
|
||||||
|
),
|
||||||
|
'屏幕录制',
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
AssetPickerLocalization.pathNameForLocale(
|
||||||
|
const Locale('zh', 'CN'),
|
||||||
|
path('Live Photos'),
|
||||||
|
),
|
||||||
|
'实况照片',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('localizes application albums and media suffixes', () {
|
||||||
|
expect(
|
||||||
|
AssetPickerLocalization.pathNameForLocale(
|
||||||
|
const Locale('zh', 'CN'),
|
||||||
|
path('WeiXin'),
|
||||||
|
),
|
||||||
|
'微信',
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
AssetPickerLocalization.pathNameForLocale(
|
||||||
|
const Locale('zh', 'CN'),
|
||||||
|
path('WhatsApp_Images'),
|
||||||
|
),
|
||||||
|
'WhatsApp 图片',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('keeps unknown and non-Chinese album names unchanged', () {
|
||||||
|
expect(
|
||||||
|
AssetPickerLocalization.pathNameForLocale(
|
||||||
|
const Locale('zh', 'CN'),
|
||||||
|
path('My Family'),
|
||||||
|
),
|
||||||
|
'My Family',
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
AssetPickerLocalization.pathNameForLocale(
|
||||||
|
const Locale('en', 'US'),
|
||||||
|
path('Camera'),
|
||||||
|
),
|
||||||
|
'Camera',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user