提交 8daea16b authored 作者: 史晓晨's avatar 史晓晨

feat:①升级Flutter SDK 3.24.5②升级AGP 8.0+

上级 c0f30d33
...@@ -21,38 +21,44 @@ if (flutterVersionName == null) { ...@@ -21,38 +21,44 @@ if (flutterVersionName == null) {
flutterVersionName = '1.0' flutterVersionName = '1.0'
} }
// AGP 8.13 支持传统 apply plugin 方式,但需确保插件版本匹配根目录配置
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android { android {
compileSdkVersion 34 // 1. 升级 compileSdk 至 36(AGP 8.13 最佳兼容版本,替代 compileSdkVersion)
compileSdk 34
// 2. JDK 版本需升级至 17(AGP 8.13 强制要求)
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_11 sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_17
} }
// 3. Kotlin JVM 目标版本同步为 17
kotlinOptions {
jvmTarget = '17'
}
sourceSets { sourceSets {
main.java.srcDirs += 'src/main/kotlin' main.java.srcDirs += 'src/main/kotlin'
} }
// 4. AGP 8.0+ 要求显式声明 namespace(替代 AndroidManifest.xml 中的 package)
namespace "com.example.example"
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.clx.flutterBase" // 保持与 namespace 一致
applicationId "com.clx.flutterBase" minSdkVersion 21 // 支持最低版本可保留 21(AGP 8.13 兼容)
// You can update the following values to match your application needs. targetSdkVersion 31// 建议与 compileSdk 一致(原 31 过低,需升级)
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 21
targetSdkVersion 31
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName
} }
buildTypes { buildTypes {
release { release {
// TODO: Add your own signing config for the release build. // 建议在 release 环境配置正式签名(此处暂保留 debug 签名用于测试)
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug signingConfig signingConfigs.debug
} }
} }
......
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android">
package="com.example.example">
<!-- The INTERNET permission is required for development. Specifically, <!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc. to allow setting breakpoints, to provide hot reload, etc.
--> -->
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET" />
</manifest> </manifest>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android">
package="com.example.example">
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.CAMERA" />
<application <application
android:label="example"
android:name="${applicationName}" android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"> android:icon="@mipmap/ic_launcher"
android:label="example">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:exported="true" android:exported="true"
android:hardwareAccelerated="true"
android:launchMode="singleTop" android:launchMode="singleTop"
android:theme="@style/LaunchTheme" android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"> android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as <!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user the Android process has started. This theme is visible to the user
...@@ -22,11 +21,10 @@ ...@@ -22,11 +21,10 @@
to determine the Window background behind the Flutter UI. --> to determine the Window background behind the Flutter UI. -->
<meta-data <meta-data
android:name="io.flutter.embedding.android.NormalTheme" android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" android:resource="@style/NormalTheme" />
/>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<!-- Don't delete the meta-data below. <!-- Don't delete the meta-data below.
......
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android">
package="com.example.example">
<!-- The INTERNET permission is required for development. Specifically, <!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc. to allow setting breakpoints, to provide hot reload, etc.
--> -->
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET" />
</manifest> </manifest>
buildscript { buildscript {
ext.kotlin_version = '1.7.10' ext.kotlin_version = '1.8.20'
repositories { repositories {
google() google()
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:7.3.0' classpath 'com.android.tools.build:gradle:8.1.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
} }
} }
......
...@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME ...@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip
\ No newline at end of file \ No newline at end of file
...@@ -15,52 +15,52 @@ class Sample extends StatelessWidget { ...@@ -15,52 +15,52 @@ class Sample extends StatelessWidget {
return MyScaffold( return MyScaffold(
title: 'Sample', title: 'Sample',
children: [ children: [
GFButton( TextButton(
fullWidthButton: true,
onPressed: () => Get.to(const BaseListWidgetTest()), onPressed: () => Get.to(const BaseListWidgetTest()),
text: '列表'), child: const Text('列表'),
GFButton( ),
fullWidthButton: true, TextButton(
onPressed: () => Get.to(const DioWidgetTest()), onPressed: () => Get.to(const DioWidgetTest()),
text: 'dio'), child: const Text('dio'),
GFButton( ),
fullWidthButton: true, TextButton(
onPressed: () { onPressed: () {
Get.dialog(const NormalDialog(content: "通用dialog")); Get.dialog(const NormalDialog(content: "通用dialog"));
}, },
text: 'NormalDialog'), child: const Text('NormalDialog'),
GFButton( ),
fullWidthButton: true, TextButton(
onPressed: () { onPressed: () {
// 1、manifest配置权限 // 1、manifest配置权限
requestPermission( requestPermission(
permissionList: [Permission.camera], toSettingTip: "请开启相机权限"); permissionList: [Permission.camera], toSettingTip: "请开启相机权限");
}, },
text: '动态申请权限'), child: const Text('动态申请权限'),
GFButton( ),
fullWidthButton: true, TextButton(
onPressed: () => Get.to(const ScrollViewPage()), onPressed: () => Get.to(const ScrollViewPage()),
text: 'scrollView'), child: const Text('scrollView'),
GFButton( ),
fullWidthButton: true, TextButton(
onPressed: () { onPressed: () {
SnackBarUtil.show("11111"); SnackBarUtil.show("11111");
}, },
text: 'SnackBar'), child: const Text('SnackBar'),
GFButton( ),
fullWidthButton: true, TextButton(
onPressed: () { onPressed: () {
ToastUtil.showToast("11111"); ToastUtil.showToast("11111");
}, },
text: 'toast'), child: const Text('toast'),
GFButton( ),
fullWidthButton: true, TextButton(
onPressed: () => Get.to(const SearchAppBarPage()), onPressed: () => Get.to(const SearchAppBarPage()),
text: 'SearchAppBar'), child: const Text('SearchAppBar'),
GFButton( ),
fullWidthButton: true, TextButton(
onPressed: () => Get.to(List1Page()), onPressed: () => Get.to(List1Page()),
text: 'BaseListWidget多次reload无法应问题'), child: const Text('BaseListWidget多次reload无法应问题'),
),
], ],
); );
} }
......
...@@ -17,16 +17,14 @@ class _ScrollViewPageState extends State<ScrollViewPage> { ...@@ -17,16 +17,14 @@ class _ScrollViewPageState extends State<ScrollViewPage> {
return MyScaffold( return MyScaffold(
title: "scrollView", title: "scrollView",
body: MyScrollView( body: MyScrollView(
keyboardConfig: KeyBoardUtils.getKeyboardActionsConfig(
context, <FocusNode>[focusNode1, focusNode2]),
children: [ children: [
TextField(focusNode: focusNode1), TextField(focusNode: focusNode1),
GFButton( TextButton(
fullWidthButton: true,
onPressed: () { onPressed: () {
ToastUtil.showToast("点击按钮"); ToastUtil.showToast("点击按钮");
}, },
text: '点击按钮'), child: const Text('点击按钮'),
),
const SizedBox(height: 500), const SizedBox(height: 500),
TextField(focusNode: focusNode2), TextField(focusNode: focusNode2),
], ],
......
...@@ -13,7 +13,7 @@ class SkeletonItem extends StatelessWidget { ...@@ -13,7 +13,7 @@ class SkeletonItem extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final themeData = Theme.of(context); final themeData = Theme.of(context);
final backgroundColor = themeData.colorScheme.surfaceVariant; final backgroundColor = themeData.colorScheme.surfaceContainerHighest;
final foregroundColor = themeData.colorScheme.surface; final foregroundColor = themeData.colorScheme.surface;
if (direction == Axis.vertical) { if (direction == Axis.vertical) {
return Card( return Card(
......
...@@ -3,13 +3,9 @@ library flutter_clx_base; ...@@ -3,13 +3,9 @@ library flutter_clx_base;
export 'package:dio/dio.dart'; export 'package:dio/dio.dart';
export 'package:easy_refresh/easy_refresh.dart'; export 'package:easy_refresh/easy_refresh.dart';
export 'package:flustars_flutter3/flustars_flutter3.dart';
export 'package:flutter_cupertino_datetime_picker/flutter_cupertino_datetime_picker.dart';
export 'package:flutter_localizations/flutter_localizations.dart'; export 'package:flutter_localizations/flutter_localizations.dart';
export 'package:get/get.dart' hide FormData hide MultipartFile hide Response; export 'package:get/get.dart' hide FormData hide MultipartFile hide Response;
export 'package:getwidget/getwidget.dart';
export 'package:image_picker/image_picker.dart'; export 'package:image_picker/image_picker.dart';
export 'package:keyboard_actions/keyboard_actions.dart';
export 'package:package_info_plus/package_info_plus.dart'; export 'package:package_info_plus/package_info_plus.dart';
export 'package:permission_handler/permission_handler.dart'; export 'package:permission_handler/permission_handler.dart';
export 'package:sp_util/sp_util.dart'; export 'package:sp_util/sp_util.dart';
......
...@@ -96,10 +96,8 @@ requestPermission({ ...@@ -96,10 +96,8 @@ requestPermission({
onFailed: onRefuse, // 权限拒绝回调 onFailed: onRefuse, // 权限拒绝回调
onOpenSetting: () { onOpenSetting: () {
Get.dialog( Get.dialog(
WillPopScope( PopScope(
onWillPop: () { canPop: false,
return Future.value(false);
},
child: NormalDialog( child: NormalDialog(
title: "温馨提示", title: "温馨提示",
content: toSettingTip, content: toSettingTip,
......
export 'package:flutter_cupertino_datetime_picker/flutter_cupertino_datetime_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:keyboard_actions/keyboard_actions.dart';
class KeyBoardUtils { class KeyBoardUtils {
static KeyboardActionsConfig getKeyboardActionsConfig(
BuildContext context,
List<FocusNode> list, {
bool displayActionBar = false, // 是否展示actionBar
}) {
return KeyboardActionsConfig(
keyboardBarColor: Colors.grey[200],
nextFocus: true,
actions: List.generate(
list.length,
(i) => KeyboardActionsItem(
displayActionBar: displayActionBar,
focusNode: list[i],
toolbarButtons: [
(node) {
return GestureDetector(
onTap: () => node.unfocus(),
child: const Padding(
padding: EdgeInsets.only(right: 16.0),
child: Text('关闭'),
),
);
},
],
)),
);
}
//隐藏键盘 //隐藏键盘
static void hideKeyboard() { static void hideKeyboard() {
FocusManager.instance.primaryFocus?.unfocus(); FocusManager.instance.primaryFocus?.unfocus();
......
...@@ -18,7 +18,7 @@ String txtIsNullWithTitle(txt, title, {nullTxt = "-"}) { ...@@ -18,7 +18,7 @@ String txtIsNullWithTitle(txt, title, {nullTxt = "-"}) {
if (txt == null || txt == "") { if (txt == null || txt == "") {
return nullTxt; return nullTxt;
} else { } else {
return title + ": " + txt; return "$title: $txt";
} }
} }
...@@ -98,7 +98,7 @@ bool checkEasyPwd(String input, String phone) { ...@@ -98,7 +98,7 @@ bool checkEasyPwd(String input, String phone) {
///密码长度8-12位 ///密码长度8-12位
///密码由数字及大小写英文字母组成 ///密码由数字及大小写英文字母组成
///密码中需包含至少1个大写字母+1个小写字母+1个数字 ///密码中需包含至少1个大写字母+1个小写字母+1个数字
bool checkPwdRule(String pwd){ bool checkPwdRule(String pwd) {
RegExp regExp = RegExp("(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[A-Za-z0-9]{8,12}"); RegExp regExp = RegExp("(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[A-Za-z0-9]{8,12}");
return regExp.hasMatch(pwd); return regExp.hasMatch(pwd);
} }
...@@ -107,7 +107,7 @@ bool checkPwdRule(String pwd){ ...@@ -107,7 +107,7 @@ bool checkPwdRule(String pwd){
///密码长度8-12位 ///密码长度8-12位
///密码由数字及大小写英文字母组成 ///密码由数字及大小写英文字母组成
///密码中需包含至少1个大写字母或1个小写字母+1个数字 ///密码中需包含至少1个大写字母或1个小写字母+1个数字
bool checkPwdRuleDriver(String pwd){ bool checkPwdRuleDriver(String pwd) {
RegExp regExp = RegExp("(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]{8,12}"); RegExp regExp = RegExp("(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]{8,12}");
return regExp.hasMatch(pwd); return regExp.hasMatch(pwd);
} }
...@@ -151,7 +151,7 @@ String hideName(String? name) { ...@@ -151,7 +151,7 @@ String hideName(String? name) {
/// 隐藏银行卡号 /// 隐藏银行卡号
String hideBankCard(String? bankCard) { String hideBankCard(String? bankCard) {
return !bankCard.isNullOrEmpty() return !bankCard.isNullOrEmpty()
? bankCard!.replaceRange(0, ? bankCard!.replaceRange(0, bankCard.length < 4 ? 0 : bankCard.length - 4,
bankCard.length < 4 ? 0 : bankCard.length - 4, '**** **** **** ***') '**** **** **** ***')
: ""; : "";
} }
import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_clx_base/common/extension.dart'; import 'package:flutter_clx_base/common/extension.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
......
export 'package:auto_size_text/auto_size_text.dart';
\ No newline at end of file
...@@ -180,7 +180,7 @@ class _BaseListWidgetState extends State<BaseListWidget> { ...@@ -180,7 +180,7 @@ class _BaseListWidgetState extends State<BaseListWidget> {
ClassicHeader( ClassicHeader(
clamping: _headerProperties.clamping, clamping: _headerProperties.clamping,
backgroundColor: _headerProperties.background backgroundColor: _headerProperties.background
? Theme.of(context).colorScheme.surfaceVariant ? Theme.of(context).colorScheme.surfaceContainerHighest
: null, : null,
mainAxisAlignment: _headerProperties.alignment, mainAxisAlignment: _headerProperties.alignment,
showMessage: _headerProperties.message, showMessage: _headerProperties.message,
...@@ -203,7 +203,7 @@ class _BaseListWidgetState extends State<BaseListWidget> { ...@@ -203,7 +203,7 @@ class _BaseListWidgetState extends State<BaseListWidget> {
ClassicFooter( ClassicFooter(
clamping: _footerProperties.clamping, clamping: _footerProperties.clamping,
backgroundColor: _footerProperties.background backgroundColor: _footerProperties.background
? Theme.of(context).colorScheme.surfaceVariant ? Theme.of(context).colorScheme.surfaceContainerHighest
: null, : null,
mainAxisAlignment: _footerProperties.alignment, mainAxisAlignment: _footerProperties.alignment,
showMessage: _footerProperties.message, showMessage: _footerProperties.message,
......
export 'package:getwidget/getwidget.dart';
...@@ -30,7 +30,7 @@ class ImageWidget { ...@@ -30,7 +30,7 @@ class ImageWidget {
url = url =
url != null && url.isNotEmpty ? "$url?${Random().nextDouble()}" : ""; url != null && url.isNotEmpty ? "$url?${Random().nextDouble()}" : "";
} }
if (TextUtil.isEmpty(url)) { if (url.isNullOrEmpty()) {
return const SizedBox(); return const SizedBox();
} }
return OctoImage( return OctoImage(
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:keyboard_actions/keyboard_actions.dart';
import 'my_app_bar.dart'; import 'my_app_bar.dart';
import 'my_scroll_view.dart'; import 'my_scroll_view.dart';
...@@ -13,7 +12,6 @@ class MyScaffold extends StatelessWidget { ...@@ -13,7 +12,6 @@ class MyScaffold extends StatelessWidget {
final String title; final String title;
final Widget? bottomButton; final Widget? bottomButton;
final CrossAxisAlignment crossAxisAlignment; final CrossAxisAlignment crossAxisAlignment;
final KeyboardActionsConfig? keyboardConfig;
final Widget? floatingActionButton; final Widget? floatingActionButton;
final ScrollController? controller; final ScrollController? controller;
final Widget? endDrawer; final Widget? endDrawer;
...@@ -28,7 +26,6 @@ class MyScaffold extends StatelessWidget { ...@@ -28,7 +26,6 @@ class MyScaffold extends StatelessWidget {
this.body, this.body,
this.bottomButton, this.bottomButton,
this.crossAxisAlignment = CrossAxisAlignment.start, this.crossAxisAlignment = CrossAxisAlignment.start,
this.keyboardConfig,
this.floatingActionButton, this.floatingActionButton,
this.controller, this.controller,
this.endDrawer, this.endDrawer,
...@@ -46,7 +43,6 @@ class MyScaffold extends StatelessWidget { ...@@ -46,7 +43,6 @@ class MyScaffold extends StatelessWidget {
padding: padding, padding: padding,
bottomButton: bottomButton, bottomButton: bottomButton,
crossAxisAlignment: crossAxisAlignment, crossAxisAlignment: crossAxisAlignment,
keyboardConfig: keyboardConfig,
controller: controller, controller: controller,
children: children ?? [], children: children ?? [],
), ),
...@@ -54,5 +50,4 @@ class MyScaffold extends StatelessWidget { ...@@ -54,5 +50,4 @@ class MyScaffold extends StatelessWidget {
floatingActionButton: floatingActionButton, floatingActionButton: floatingActionButton,
); );
} }
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:keyboard_actions/keyboard_actions.dart';
/// 本项目通用的布局(SingleChildScrollView) /// 本项目通用的布局(SingleChildScrollView)
/// 1.底部存在按钮 /// 1.底部存在按钮
...@@ -14,7 +13,6 @@ class MyScrollView extends StatelessWidget { ...@@ -14,7 +13,6 @@ class MyScrollView extends StatelessWidget {
this.physics = const BouncingScrollPhysics(), this.physics = const BouncingScrollPhysics(),
this.crossAxisAlignment = CrossAxisAlignment.start, this.crossAxisAlignment = CrossAxisAlignment.start,
this.bottomButton, this.bottomButton,
this.keyboardConfig,
this.tapOutsideToDismiss = false, this.tapOutsideToDismiss = false,
this.overScroll = 16.0, this.overScroll = 16.0,
this.controller, this.controller,
...@@ -25,7 +23,6 @@ class MyScrollView extends StatelessWidget { ...@@ -25,7 +23,6 @@ class MyScrollView extends StatelessWidget {
final ScrollPhysics physics; final ScrollPhysics physics;
final CrossAxisAlignment crossAxisAlignment; final CrossAxisAlignment crossAxisAlignment;
final Widget? bottomButton; final Widget? bottomButton;
final KeyboardActionsConfig? keyboardConfig;
final ScrollController? controller; final ScrollController? controller;
/// 键盘外部按下将其关闭 /// 键盘外部按下将其关闭
......
...@@ -13,53 +13,53 @@ dependencies: ...@@ -13,53 +13,53 @@ dependencies:
flutter_localizations: flutter_localizations:
sdk: flutter sdk: flutter
# dio https://pub.dev/packages/dio # dio https://pub.dev/packages/dio
dio: ^5.3.1 dio: ^5.9.0
# 时间选择器 https://pub.dev/packages/flutter_cupertino_datetime_picker # 时间选择器 https://pub.dev/packages/flutter_cupertino_datetime_picker
flutter_cupertino_datetime_picker: ^3.0.0 # flutter_cupertino_datetime_picker: ^3.0.0
# 键盘工具类 https://pub.dev/packages/keyboard_actions # 键盘工具类 https://pub.dev/packages/keyboard_actions
keyboard_actions: ^4.0.1 # keyboard_actions: ^4.0.1
# sp https://pub.dev/packages/sp_util # sp https://pub.dev/packages/sp_util
sp_util: ^2.0.3 sp_util: ^2.0.3
# get https://pub.dev/packages/get # get https://pub.dev/packages/get
get: ^4.6.5 get: ^4.7.2
# 日志打印 https://pub.dev/packages/logger # 日志打印 https://pub.dev/packages/logger
logger: ^1.2.2 logger: ^2.6.2
# toast https://pub.dev/packages/fluttertoast # toast https://pub.dev/packages/fluttertoast
fluttertoast: ^8.2.1 fluttertoast: ^8.2.14
# webview https://pub.dev/packages/webview_flutter # webview https://pub.dev/packages/webview_flutter
webview_flutter: ^4.0.5 webview_flutter: ^4.10.0
# 显示网页Widget https://pub.dev/packages/flutter_widget_from_html_core # 显示网页Widget https://pub.dev/packages/flutter_widget_from_html_core
flutter_widget_from_html_core: ^0.10.0 flutter_widget_from_html_core: ^0.16.1
# 包信息 https://pub.dev/packages/package_info_plus # 包信息 https://pub.dev/packages/package_info_plus
package_info_plus: ^3.0.3 package_info_plus: ^8.3.1
# 权限 https://pub.dev/packages/permission_handler # 权限 https://pub.dev/packages/permission_handler
permission_handler: ^9.2.0 permission_handler: ^12.0.1
# https://pub.dev/packages/url_launcher # https://pub.dev/packages/url_launcher
url_launcher: ^6.1.2 url_launcher: ^6.3.1
# loading https://pub.dev/packages/flutter_easyloading # loading https://pub.dev/packages/flutter_easyloading
flutter_easyloading: ^3.0.5 flutter_easyloading: ^3.0.5
# https://pub.dev/packages/auto_size_text # https://pub.dev/packages/auto_size_text
auto_size_text: ^3.0.0 # auto_size_text: ^3.0.0
# https://pub.flutter-io.cn/packages/getwidget # https://pub.flutter-io.cn/packages/getwidget
getwidget: ^3.0.1 # getwidget: ^3.0.1
# https://pub.dev/packages/octo_image # https://pub.dev/packages/octo_image
octo_image: ^2.0.0 # octo_image: ^2.1.0
# https://pub.dev/packages/cached_network_image # https://pub.dev/packages/cached_network_image
cached_network_image: ^3.3.0 cached_network_image: ^3.4.1
# https://pub.dev/packages/image_picker # https://pub.dev/packages/image_picker
image_picker: ^0.8.6 image_picker: ^1.1.2
#https://pub.dev/packages/flustars_flutter3 #https://pub.dev/packages/flustars_flutter3
flustars_flutter3: ^3.0.0 # flustars_flutter3: ^3.0.0
#https://pub.dev/packages/easy_refresh #https://pub.dev/packages/easy_refresh
easy_refresh: ^3.3.1 easy_refresh: ^3.4.0
#https://pub.dev/packages/flutter_spinkit #https://pub.dev/packages/flutter_spinkit
flutter_spinkit: ^5.1.0 # flutter_spinkit: ^5.1.0
# https://pub.dev/packages/pretty_dio_logger # https://pub.dev/packages/pretty_dio_logger
pretty_dio_logger: ^1.3.1 pretty_dio_logger: ^1.4.0
# 获取设备唯一标识 https://pub.dev/packages/unique_identifier # 获取设备唯一标识 https://pub.dev/packages/unique_identifier
unique_identifier: ^0.3.0 # unique_identifier: ^0.3.0
# 设备信息 https://pub.dev/packages/device_info_plus # 设备信息 https://pub.dev/packages/device_info_plus
device_info_plus: ^8.1.0 device_info_plus: ^11.2.2
#获取设备id https://t.clxkj:cn/openSourceLibrary/device_id_plugin.git #获取设备id https://t.clxkj:cn/openSourceLibrary/device_id_plugin.git
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论