Merge branch 'main' into dev

# Conflicts:
#	ln_jq_app/android/app/src/main/AndroidManifest.xml
#	ln_jq_app/pubspec.lock
同步线上
This commit is contained in:
2026-03-31 15:07:16 +08:00
9 changed files with 250 additions and 84 deletions

View File

@@ -21,9 +21,7 @@
.amap-callamap,
.amap-lib-driving-callBtn,
.amap-copyright,
.amap-logo {
display: none !important;
}
.amap-logo{bottom: 60px}
/* 去除高德默认的 label 边框 and 背景 */
.amap-marker-label {

View File

@@ -151,7 +151,7 @@ SPEC CHECKSUMS:
AMapNavIOSSDK: e06adcb48ac8abeace46ea31f72191564e54a186
AMapSearch-NO-IDFA: 53b2193244be8f07f3be0a4d5161200236960587
connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
device_info_plus: 71ffc6ab7634ade6267c7a93088ed7e4f74e5896
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_app_update: 816fdb2e30e4832a7c45e3f108d391c42ef040a9
flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99

View File

@@ -1,9 +1,13 @@
import 'dart:io';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
import 'package:ln_jq_app/common/login_util.dart';
import 'package:ln_jq_app/pages/b_page/reservation/controller.dart';
import 'package:ln_jq_app/pages/c_page/message/view.dart';
import 'package:ln_jq_app/pages/common/webview/view.dart';
class ReservationPage extends GetView<ReservationController> {
const ReservationPage({super.key});
@@ -36,6 +40,30 @@ class ReservationPage extends GetView<ReservationController> {
_buildSystemTips(),
SizedBox(height: 24),
_buildLogoutButton(),
SizedBox(height: 15.h),
Text.rich(
TextSpan(
style: const TextStyle(color: Colors.grey, fontSize: 13),
children: [
TextSpan(
text: '《用户协议》',
style: TextStyle(color: Colors.blue, fontSize: 13),
recognizer: TapGestureRecognizer()
..onTap = () {
openPage("用户协议", "https://lnh2e.com/user_agreement.html");
},
),
TextSpan(
text: '《隐私政策》',
style: TextStyle(color: Colors.blue, fontSize: 13),
recognizer: TapGestureRecognizer()
..onTap = () {
openPage("隐私政策", "https://lnh2e.com/privacy_agreement.html");
},
),
],
),
),
SizedBox(height: 95.h),
],
),
@@ -48,6 +76,14 @@ class ReservationPage extends GetView<ReservationController> {
);
}
void openPage(String title, String url) {
if (Platform.isIOS) {
openWebPage(url);
return;
}
Get.to(() => const WebViewPage(), arguments: {'title': title, 'url': url});
}
/// 1. 顶部个人信息及统计栏
Widget _buildTopSection(BuildContext context) {
return Container(

View File

@@ -1,10 +1,15 @@
import 'dart:io';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:getx_scaffold/common/index.dart';
import 'package:getx_scaffold/common/widgets/index.dart';
import 'package:ln_jq_app/common/login_util.dart';
import 'package:ln_jq_app/common/styles/theme.dart';
import 'package:ln_jq_app/pages/c_page/message/view.dart';
import 'package:ln_jq_app/pages/common/webview/view.dart';
import 'package:ln_jq_app/storage_service.dart';
import 'controller.dart';
@@ -38,6 +43,30 @@ class MinePage extends GetView<MineController> {
_buildSafetyReminderCard(),
SizedBox(height: 24.h),
_buildLogoutButton(),
SizedBox(height: 15.h),
Text.rich(
TextSpan(
style: const TextStyle(color: Colors.grey, fontSize: 13),
children: [
TextSpan(
text: '《用户协议》',
style: TextStyle(color: Colors.blue, fontSize: 13),
recognizer: TapGestureRecognizer()
..onTap = () {
openPage("用户协议", "https://lnh2e.com/user_agreement.html");
},
),
TextSpan(
text: '《隐私政策》',
style: TextStyle(color: Colors.blue, fontSize: 13),
recognizer: TapGestureRecognizer()
..onTap = () {
openPage("隐私政策", "https://lnh2e.com/privacy_agreement.html");
},
),
],
),
),
SizedBox(height: 95.h),
],
),
@@ -51,6 +80,15 @@ class MinePage extends GetView<MineController> {
);
}
void openPage(String title, String url) {
if (Platform.isIOS) {
openWebPage(url);
return;
}
Get.to(() => const WebViewPage(), arguments: {'title': title, 'url': url});
}
/// 构建顶部用户信息卡片
Widget _buildUserInfoCard() {
return Card(

View File

@@ -29,14 +29,6 @@ class HomeController extends GetxController with BaseControllerMixin {
@override
void onInit() {
super.onInit();
// 检查是否同意过隐私政策,只有同意后才初始化推送
if (StorageService.to.isPrivacyAgreed) {
requestPermission();
initAliyunPush();
addPushCallback();
}
FlutterNativeSplash.remove();
log('page-init');
@@ -159,6 +151,13 @@ class HomeController extends GetxController with BaseControllerMixin {
// 根据登录状态和登录渠道返回不同的首页
Widget getHomePage() {
if (StorageService.to.isLoggedIn) {
// 检查是否同意过隐私政策,只有同意后才初始化推送
if (StorageService.to.isPrivacyAgreed) {
requestPermission();
initAliyunPush();
addPushCallback();
}
if (StorageService.to.loginChannel == LoginChannel.station) {
return B_BaseWidgetsPage();
} else if (StorageService.to.loginChannel == LoginChannel.driver) {

View File

@@ -140,9 +140,29 @@ class _LoginPageState extends State<LoginPage> with SingleTickerProviderStateMix
children: [
const SizedBox(height: 30),
// 根据 Tab 显示不同的输入框
_tabController.index == 0
!_isAgreed
? GestureDetector(
onTap: () => _handleLogin(controller),
behavior: HitTestBehavior.opaque,
child: Container(
width: double.infinity,
height: 55.h,
padding: const EdgeInsets.symmetric(
horizontal: 24,
),
alignment: Alignment.centerLeft,
child: Text(
"请先阅读并同意用户协议和隐私政策",
style: TextStyle(
color: Colors.grey,
fontSize: 16,
),
),
),
)
: (_tabController.index == 0
? _buildDriverInputFields(controller)
: _buildStationInputFields(controller),
: _buildStationInputFields(controller)),
const SizedBox(height: 30),
// 统一登录按钮
@@ -150,7 +170,8 @@ class _LoginPageState extends State<LoginPage> with SingleTickerProviderStateMix
const SizedBox(height: 10),
buildAgreement(),
const SizedBox(height: 40),
const SizedBox(height: 80),
_buildFooterSlogan(),
],
),
),
@@ -159,7 +180,6 @@ class _LoginPageState extends State<LoginPage> with SingleTickerProviderStateMix
),
),
),
Positioned(left: 0, right: 0, bottom: 33.h, child: _buildFooterSlogan()),
if (AppTheme.is_show_host)
Positioned(
top: 40.h,
@@ -475,7 +495,6 @@ class _LoginPageState extends State<LoginPage> with SingleTickerProviderStateMix
}
}
_processLoginResponse(responseData, "station", account);
} catch (e) {
dismissLoading();
@@ -539,7 +558,6 @@ class _LoginPageState extends State<LoginPage> with SingleTickerProviderStateMix
Logger.d("暂时不处理 查询车辆信息失败的情况");
}
dismissLoading();
Get.offAll(() => BaseWidgetsPage());
} else {
@@ -596,9 +614,7 @@ class _LoginPageState extends State<LoginPage> with SingleTickerProviderStateMix
}
// 添加推送回调
_aliyunPush.addMessageReceiver(
onNotificationOpened: _onNotificationOpened,
);
_aliyunPush.addMessageReceiver(onNotificationOpened: _onNotificationOpened);
isPushInitialized = true;
Logger.d('推送服务初始化成功');

View File

@@ -1,16 +1,103 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_native_splash/flutter_native_splash.dart';
import 'package:get/get.dart';
import 'package:getx_scaffold/common/components/index.dart';
import 'package:getx_scaffold/common/widgets/rich_text_x.dart';
import 'package:ln_jq_app/pages/home/view.dart';
import 'package:ln_jq_app/pages/login/view.dart';
import 'package:ln_jq_app/storage_service.dart';
import '../common/webview/view.dart';
class WelcomeController extends GetxController {
@override
void onReady() {
super.onReady();
// 移除原生闪屏页(如果有的话)
FlutterNativeSplash.remove();
_startTimer();
if (Platform.isAndroid) {
if (StorageService.to.isPrivacyAgreed) {
_startTimer();
} else {
showPrivacyDialog();
}
} else if (Platform.isIOS) {
_startTimer();
}
}
void showPrivacyDialog() {
DialogX.to.showConfirmDialog(
title: "个人信息保护提示",
content: _buildDialogContent(),
confirmText: '同意',
cancelText: '不同意',
onConfirm: () async {
await StorageService.to.savePrivacyAgreed(true);
Get.offAll(() => const HomePage());
},
onCancel: () {
DialogX.to.showConfirmDialog(
title: "温馨提示",
content: RichTextX(
children: [
TextSpanItem('如果您不同意'),
TextSpanItem(
'《隐私协议》',
onTap: () => openPage("隐私政策", "https://lnh2e.com/privacy_agreement.html"),
),
TextSpanItem(''),
TextSpanItem(
'《用户政策》',
onTap: () => openPage("用户协议", "https://lnh2e.com/user_agreement.html"),
),
TextSpanItem(
',很遗憾我们将无法为您提供服务。您需要同意以上协议后,才能使用本应用。\n\n我们将严格按照相关法律法规要求,坚决保护您的个人隐私和信息安全。',
),
TextSpanItem('\n点击“同意”按钮,表示您已知情并同意以上协议。'),
],
),
confirmText: '同意并继续',
cancelText: '不同意',
onConfirm: () async {
await StorageService.to.savePrivacyAgreed(true);
Get.offAll(() => const HomePage());
},
onCancel: () {
SystemNavigator.pop();
},
);
},
);
}
Widget _buildDialogContent() {
return RichTextX(
children: [
TextSpanItem('欢迎使用小羚羚!\n我们将通过'),
TextSpanItem(
'《隐私协议》',
onTap: () => openPage("隐私政策", "https://lnh2e.com/privacy_agreement.html"),
),
TextSpanItem(''),
TextSpanItem(
'《用户政策》',
onTap: () => openPage("用户协议", "https://lnh2e.com/user_agreement.html"),
),
TextSpanItem(
',帮助您了解我们为您提供的服务、我们如何处理个人信息以及您享有的权利。我们会严格按照相关法律法规要求,采取各种安全措施来保护您的个人信息。',
),
TextSpanItem('\n点击“同意”按钮,表示您已知情并同意以上协议。'),
],
);
}
void openPage(String title, String url) {
Get.to(() => const WebViewPage(), arguments: {'title': title, 'url': url});
}
void _startTimer() {

View File

@@ -21,10 +21,10 @@ packages:
dependency: transitive
description:
name: archive
sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff
sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.0.9"
version: "4.0.7"
args:
dependency: transitive
description:
@@ -45,10 +45,10 @@ packages:
dependency: transitive
description:
name: async
sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.13.1"
version: "2.13.0"
badges:
dependency: transitive
description:
@@ -117,10 +117,10 @@ packages:
dependency: transitive
description:
name: cross_file
sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937"
sha256: "701dcfc06da0882883a2657c445103380e53e647060ad8d9dfb710c100996608"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.3.5+2"
version: "0.3.5+1"
crypto:
dependency: transitive
description:
@@ -141,18 +141,18 @@ packages:
dependency: "direct main"
description:
name: cupertino_icons
sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd"
sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.9"
version: "1.0.8"
dbus:
dependency: transitive
description:
name: dbus
sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270
sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.7.12"
version: "0.7.11"
decimal:
dependency: transitive
description:
@@ -162,13 +162,13 @@ packages:
source: hosted
version: "3.2.4"
device_info_plus:
dependency: transitive
dependency: "direct overridden"
description:
name: device_info_plus
sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074
sha256: "4df8babf73058181227e18b08e6ea3520cf5fc5d796888d33b7cb0f33f984b7c"
url: "https://pub.flutter-io.cn"
source: hosted
version: "10.1.2"
version: "12.3.0"
device_info_plus_platform_interface:
dependency: transitive
description:
@@ -181,18 +181,18 @@ packages:
dependency: transitive
description:
name: dio
sha256: aff32c08f92787a557dd5c0145ac91536481831a01b4648136373cddb0e64f8c
sha256: d90ee57923d1828ac14e492ca49440f65477f4bb1263575900be731a3dac66a9
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.9.2"
version: "5.9.0"
dio_web_adapter:
dependency: transitive
description:
name: dio_web_adapter
sha256: "2f9e64323a7c3c7ef69567d5c800424a11f8337b8b228bad02524c9fb3c1f340"
sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.2"
version: "2.1.1"
dropdown_button2:
dependency: "direct main"
description:
@@ -245,10 +245,10 @@ packages:
dependency: transitive
description:
name: ffi
sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45"
sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.0"
version: "2.1.4"
file:
dependency: transitive
description:
@@ -338,10 +338,10 @@ packages:
dependency: transitive
description:
name: flutter_inappwebview_internal_annotations
sha256: e30fba942e3debea7b7e6cdd4f0f59ce89dd403a9865193e3221293b6d1544c6
sha256: "787171d43f8af67864740b6f04166c13190aa74a1468a1f1f1e9ee5b90c359cd"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.0"
version: "1.2.0"
flutter_inappwebview_ios:
dependency: transitive
description:
@@ -415,10 +415,10 @@ packages:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
sha256: "38d1c268de9097ff59cf0e844ac38759fc78f76836d37edad06fa21e182055a0"
sha256: ee8068e0e1cd16c4a82714119918efdeed33b3ba7772c54b5d094ab53f9b7fd1
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.34"
version: "2.0.33"
flutter_screenutil:
dependency: transitive
description:
@@ -439,10 +439,10 @@ packages:
dependency: transitive
description:
name: flutter_svg
sha256: "1ded017b39c8e15c8948ea855070a5ff8ff8b3d5e83f3446e02d6bb12add7ad9"
sha256: "87fbd7c534435b6c5d9d98b01e1fd527812b82e68ddd8bd35fc45ed0fa8f0a95"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.4"
version: "2.2.3"
flutter_test:
dependency: "direct dev"
description: flutter
@@ -585,10 +585,10 @@ packages:
dependency: "direct main"
description:
name: image
sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce
sha256: "492bd52f6c4fbb6ee41f781ff27765ce5f627910e1e0cbecfa3d9add5562604c"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.8.0"
version: "4.7.2"
image_picker:
dependency: "direct main"
description:
@@ -601,10 +601,10 @@ packages:
dependency: transitive
description:
name: image_picker_android
sha256: "9eae0cbd672549dacc18df855c2a23782afe4854ada5190b7d63b30ee0b0d3fd"
sha256: "5e9bf126c37c117cf8094215373c6d561117a3cfb50ebc5add1a61dc6e224677"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.8.13+15"
version: "0.8.13+10"
image_picker_for_web:
dependency: transitive
description:
@@ -741,14 +741,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.0"
mobile_scanner:
dependency: "direct main"
description:
name: mobile_scanner
sha256: c92c26bf2231695b6d3477c8dcf435f51e28f87b1745966b1fe4c47a286171ce
url: "https://pub.flutter-io.cn"
source: hosted
version: "7.2.0"
modal_bottom_sheet:
dependency: transitive
description:
@@ -809,10 +801,10 @@ packages:
dependency: transitive
description:
name: path_provider_android
sha256: "149441ca6e4f38193b2e004c0ca6376a3d11f51fa5a77552d8bd4d2b0c0912ba"
sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.23"
version: "2.2.22"
path_provider_foundation:
dependency: transitive
description:
@@ -897,10 +889,10 @@ packages:
dependency: transitive
description:
name: petitparser
sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675"
sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1"
url: "https://pub.flutter-io.cn"
source: hosted
version: "7.0.2"
version: "7.0.1"
photo_view:
dependency: "direct main"
description:
@@ -937,10 +929,10 @@ packages:
dependency: transitive
description:
name: posix
sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07"
sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61"
url: "https://pub.flutter-io.cn"
source: hosted
version: "6.5.0"
version: "6.0.3"
pull_to_refresh:
dependency: "direct main"
description:
@@ -969,18 +961,18 @@ packages:
dependency: "direct main"
description:
name: shared_preferences
sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf
sha256: "2939ae520c9024cb197fc20dee269cd8cdbf564c8b5746374ec6cacdc5169e64"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.5.5"
version: "2.5.4"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53
sha256: "83af5c682796c0f7719c2bbf74792d113e40ae97981b8f266fa84574573556bc"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.23"
version: "2.4.18"
shared_preferences_foundation:
dependency: transitive
description:
@@ -1001,10 +993,10 @@ packages:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9"
sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.2"
version: "2.4.1"
shared_preferences_web:
dependency: transitive
description:
@@ -1038,10 +1030,10 @@ packages:
dependency: transitive
description:
name: source_span
sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab"
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.10.2"
version: "1.10.1"
stack_trace:
dependency: transitive
description:
@@ -1110,10 +1102,10 @@ packages:
dependency: transitive
description:
name: url_launcher_android
sha256: "3bb000251e55d4a209aa0e2e563309dc9bb2befea2295fd0cec1f51760aac572"
sha256: "767344bf3063897b5cf0db830e94f904528e6dd50a6dfaf839f0abf509009611"
url: "https://pub.flutter-io.cn"
source: hosted
version: "6.3.29"
version: "6.3.28"
url_launcher_ios:
dependency: transitive
description:
@@ -1166,18 +1158,18 @@ packages:
dependency: transitive
description:
name: uuid
sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489"
sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.5.3"
version: "4.5.2"
vector_graphics:
dependency: transitive
description:
name: vector_graphics
sha256: "7076216a10d5c390315fbe536a30f1254c341e7543e6c4c8a815e591307772b1"
sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.20"
version: "1.1.19"
vector_graphics_codec:
dependency: transitive
description:
@@ -1190,10 +1182,10 @@ packages:
dependency: transitive
description:
name: vector_graphics_compiler
sha256: "5a88dd14c0954a5398af544651c7fb51b457a2a556949bfb25369b210ef73a74"
sha256: d354a7ec6931e6047785f4db12a1f61ec3d43b207fc0790f863818543f8ff0dc
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0"
version: "1.1.19"
vector_math:
dependency: transitive
description:
@@ -1230,10 +1222,10 @@ packages:
dependency: transitive
description:
name: win32_registry
sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852"
sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.5"
version: "2.1.0"
xdg_directories:
dependency: transitive
description:

View File

@@ -46,7 +46,6 @@ dependencies:
dropdown_button2: ^2.3.8
image_picker: ^1.2.1 # 用于从相册选择图片
image: ^4.5.4
mobile_scanner: ^7.1.4
flutter_pdfview: 1.4.3 #显示pdf
photo_view: ^0.15.0 #操作图片
flutter_inappwebview: ^6.1.5 # WebView插件
@@ -66,6 +65,7 @@ dev_dependencies:
dependency_overrides:
intl: 0.19.0
device_info_plus: ^12.3.0
flutter: