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

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

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