diff --git a/lib/data/services/version_update_service.dart b/lib/data/services/version_update_service.dart index b6822c17f..c7cef7841 100644 --- a/lib/data/services/version_update_service.dart +++ b/lib/data/services/version_update_service.dart @@ -119,6 +119,9 @@ class VersionUpdateService extends GetxService { } /// 根据设备品牌获取应用商店信息 + /// + /// 该方法根据设备品牌判断应用商店类型,并返回对应的 [PlatformInfo] 对象。 + /// 如果品牌不在预设列表中,将使用环境变量 [Channel] 或默认值 [UserChannel.GLOBAL_GOOGLE]。 Future getAndroidStoreInfoByBrand() async { try { final deviceInfo = DeviceInfoPlugin(); @@ -129,49 +132,37 @@ class VersionUpdateService extends GetxService { String channelFromEnv = dotenv.env['Channel'] ?? 'OFFICIAL'; _channel = UserChannel.fromName(channelFromEnv); + UserChannel brandChannel; //品牌渠道,只用于请求版本更新信息 + + switch (brand) { + case 'huawei': + brandChannel = UserChannel.CHINA_HUAWEI; + break; + case 'xiaomi': + case 'redmi': + brandChannel = UserChannel.CHINA_XIAOMI; + break; + case 'oppo': + case 'oneplus': + brandChannel = UserChannel.CHINA_OPPO; + break; + case 'vivo': + case 'iqoo': + brandChannel = UserChannel.CHINA_VIVO; + break; + case 'honor': + brandChannel = UserChannel.CHINA_HONOR; + break; + default: + brandChannel = _channel ?? UserChannel.GLOBAL_GOOGLE; + break; + } + return PlatformInfo( platform: 'android', storeType: AppStoreType.official, - channel: _channel ?? UserChannel.OFFICIAL, + channel: brandChannel, ); - - // switch (brand) { - // case 'huawei': - // case 'honor': - // return PlatformInfo( - // platform: 'android', - // storeType: - // brand == 'huawei' ? AppStoreType.huawei : AppStoreType.honor, - // channel: brand == 'huawei' ? '华为应用市场' : '荣耀应用市场', - // ); - // case 'xiaomi': - // case 'redmi': - // return const PlatformInfo( - // platform: 'android', - // storeType: AppStoreType.xiaomi, - // channel: '小米应用商店', - // ); - // case 'oppo': - // case 'oneplus': - // return const PlatformInfo( - // platform: 'android', - // storeType: AppStoreType.oppo, - // channel: 'OPPO软件商店', - // ); - // case 'vivo': - // case 'iqoo': - // return const PlatformInfo( - // platform: 'android', - // storeType: AppStoreType.vivo, - // channel: 'vivo应用商店', - // ); - // default: - // return const PlatformInfo( - // platform: 'android', - // storeType: AppStoreType.googlePlay, - // channel: 'Google Play', - // ); - // } } catch (e) { _logger.e('获取Android设备信息失败: $e'); return const PlatformInfo( @@ -205,14 +196,14 @@ class VersionUpdateService extends GetxService { final platformInfo = await getCurrentPlatformInfo(); _platform = platformInfo.platform; - _channel = platformInfo.channel; + //_channel = platformInfo.channel; _lastCheckTime = DateTime.now(); // 调用后端接口获取最新版本信息 final response = await Api.getChannelApp({'channel': platformInfo.channel.value}); - _logger.d('获取渠道包信息:$response'); + _logger.d('lxm--获取渠道包信息:$response'); if (response == null || !response.containsKey('app')) { //[2]获取渠道包信息失败: 响应为空或不包含app字段 diff --git a/lib/modules/meeting/views/template/template_edit_view.dart b/lib/modules/meeting/views/template/template_edit_view.dart new file mode 100644 index 000000000..7e4798f85 --- /dev/null +++ b/lib/modules/meeting/views/template/template_edit_view.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +class TemplateEditView extends StatefulWidget { + const TemplateEditView({super.key}); + + @override + State createState() => _TemplateEditViewState(); +} + +class _TemplateEditViewState extends State { + TextEditingController titleController = TextEditingController(); + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Scaffold( + backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], + appBar: _buildAppBar(isDarkMode), + body: _buildBody(isDarkMode), + ); + } + + // 构建应用栏 + PreferredSizeWidget _buildAppBar(bool isDarkMode) { + return AppBar( + backgroundColor: isDarkMode ? Colors.black : Colors.white, + elevation: 0.5, + leading: IconButton( + icon: Icon( + Icons.arrow_back_ios, + color: isDarkMode ? Colors.white : Colors.black, + size: 20.sp, + ), + onPressed: () => Get.back(), + ), + title: Text( + '创建模版', + style: TextStyle( + fontSize: 17.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + centerTitle: true, + ); + } + + // 构建主体内容 + Widget _buildBody(bool isDarkMode) { + return Column( + children: [ + Expanded( + child: ListView( + children: [], + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), + child: GestureDetector( + onTap: () {}, + child: Container( + height: 48.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.black, + borderRadius: BorderRadius.circular(12.r), + ), + child: Text( + '提交', + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + ), + ), + ), + ), + ), + ], + ); + } +} diff --git a/lib/modules/meeting/views/template/template_view.dart b/lib/modules/meeting/views/template/template_view.dart index 2d77797fb..457d370e4 100644 --- a/lib/modules/meeting/views/template/template_view.dart +++ b/lib/modules/meeting/views/template/template_view.dart @@ -3,6 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'template_all_view.dart'; +import 'template_edit_view.dart'; class TemplateView extends StatefulWidget { final Map templateData; @@ -117,7 +118,7 @@ class _TemplateViewState extends State { itemCount: _categoryTemplateList.length, itemBuilder: (BuildContext context, int index) { Map data = _categoryTemplateList[index]; - return _item(data); + return _item(data, index == _categoryTemplateList.length - 1); }, ), ), @@ -148,8 +149,9 @@ class _TemplateViewState extends State { ); } - Widget _item(Map data) { + Widget _item(Map data, bool isLast) { return Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ GestureDetector( onTap: () { @@ -183,15 +185,27 @@ class _TemplateViewState extends State { Container( height: 150.w, margin: EdgeInsets.only(bottom: 15.w), - child: ListView.builder( - itemCount: data['template'].length, - scrollDirection: Axis.horizontal, - padding: EdgeInsets.symmetric(horizontal: 8.w), - itemBuilder: (BuildContext context, int index) { - Map template = data['template'][index]; - return _template(template); - }, - ), + child: isLast && data['template'].length == 0 + ? Padding( + padding: EdgeInsets.symmetric(horizontal: 8.w), + child: _createTemplate(), + ) + : ListView.builder( + itemCount: data['template'].length, + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: 8.w), + itemBuilder: (BuildContext context, int index) { + Map template = data['template'][index]; + return isLast && index == 0 + ? Row( + children: [ + _createTemplate(), + _template(template), + ], + ) + : _template(template); + }, + ), ), ], ); @@ -338,4 +352,47 @@ class _TemplateViewState extends State { ), ); } + + Widget _createTemplate() { + return GestureDetector( + onTap: () { + Get.to(() => const TemplateEditView()); + }, + child: Container( + width: 200.w, + margin: EdgeInsets.symmetric(horizontal: 4.w), + clipBehavior: Clip.hardEdge, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(14.w), + ), + child: Container( + color: Colors.white, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(top: 5.w), + child: Icon( + Icons.add_circle_outlined, + color: Colors.orange, + size: 30.w, + ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 10.w), + child: Text( + '创建', + style: TextStyle( + fontSize: 16.sp, + color: Colors.black87, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ), + ), + ); + } } diff --git a/lib/modules/settings/controllers/settings_controller.dart b/lib/modules/settings/controllers/settings_controller.dart index 48ec63019..8084cfa29 100644 --- a/lib/modules/settings/controllers/settings_controller.dart +++ b/lib/modules/settings/controllers/settings_controller.dart @@ -629,20 +629,20 @@ class SettingsController extends GetxController { try { final versionService = Get.find(); return ''' - 应用版本: ${versionService.cachedAppVersion} - 构建号: ${versionService.cachedBuildNumber} - 平台: ${versionService.cachedPlatform} - 设备品牌: ${versionService.cachedDeviceBrand} - 渠道: ${versionService.cachedChannel} - 最新版本: ${versionService.cachedLatestVersion} - 有更新: ${versionService.cachedHasUpdate} - 强制更新: ${versionService.cachedIsForceUpdate} - 更新链接: ${versionService.cachedUpdateUrl} - 游客模式: ${versionService.cachedShowTourists} - 最近版本检查时间: ${versionService.lastCheckTime ?? '未检查'} - 国家地区编码: ${versionService.cachedCountryCode} - 语言编码: ${versionService.cachedLanguageCode} - 服务器地址: ${versionService.cachedServerUrl} +应用版本: ${versionService.cachedAppVersion} +构建号: ${versionService.cachedBuildNumber} +平台: ${versionService.cachedPlatform} +设备品牌: ${versionService.cachedDeviceBrand} +渠道: ${versionService.cachedChannel} +最新版本: ${versionService.cachedLatestVersion} +有更新: ${versionService.cachedHasUpdate} +强制更新: ${versionService.cachedIsForceUpdate} +更新链接: ${versionService.cachedUpdateUrl} +游客模式: ${versionService.cachedShowTourists} +最近版本检查时间: ${versionService.lastCheckTime ?? '未检查'} +国家地区编码: ${versionService.cachedCountryCode} +语言编码: ${versionService.cachedLanguageCode} +服务器地址: ${versionService.cachedServerUrl} '''; } catch (e) { return '获取版本服务数据失败: $e'; diff --git a/lib/modules/splash/controllers/splash_controller.dart b/lib/modules/splash/controllers/splash_controller.dart index 49454294b..60631b889 100644 --- a/lib/modules/splash/controllers/splash_controller.dart +++ b/lib/modules/splash/controllers/splash_controller.dart @@ -68,16 +68,15 @@ class SplashController extends GetxController { } /// 切换隐私政策同意状态 - 新增方法 - void togglePrivacyAcceptance() { - _hasAcceptedPrivacy.value = !_hasAcceptedPrivacy.value; - _storage.write('hasAcceptedPrivacy', _hasAcceptedPrivacy.value); - } + // void togglePrivacyAcceptance() { + // _hasAcceptedPrivacy.value = !_hasAcceptedPrivacy.value; + // _storage.write('hasAcceptedPrivacy', _hasAcceptedPrivacy.value); + // } /// 检查隐私政策,如果未同意,则显示弹窗并等待用户操作 /// 返回用户是否同意 Future _checkAndRequestPrivacy() async { - if (_storage.read('hasAcceptedPrivacy') ?? false) { - _hasAcceptedPrivacy.value = true; + if (_hasAcceptedPrivacy.value) { return true; } @@ -101,7 +100,6 @@ class SplashController extends GetxController { return completer.future; } - /// 网络连接检查 /// 网络连接检查 - 阻塞版本 Future _checkNetworkStatus() async { while (true) { @@ -196,11 +194,15 @@ class SplashController extends GetxController { //步骤2:检查网络连接状态 await _checkNetworkStatus(); // 同样使用 Future.wait,确保此函数在所有子任务完成后才结束 - await Future.wait([ - _requestTrackingPermissionAsync(), - _validateTokenAsync(), - _performVersionCheckAsync(), - ]); + // 先请求系统权限,避免与版本弹窗竞争 + await _requestTrackingPermissionAsync(); + await _performVersionCheckAsync(); + await _validateTokenAsync(); + //await Future.wait([ + //_requestTrackingPermissionAsync(), + //_validateTokenAsync(), + //_performVersionCheckAsync(), + //]); Logger.d(_tag, '所有后台任务已完成'); } @@ -242,22 +244,18 @@ class SplashController extends GetxController { if (updateInfo.hasUpdate) { Logger.i(_tag, '发现新版本: ${updateInfo.latestVersion}'); - final completer = Completer(); - // 在主线程中显示更新对话框 - WidgetsBinding.instance.addPostFrameCallback((_) { - // 使用 whenComplete 确保无论弹窗如何关闭,Future 都会完成 - VersionUpdateDialog.show(updateInfo).whenComplete(() { - if (!completer.isCompleted) completer.complete(); - }); - }); - // 等待弹窗交互结束 - await completer.future; + // 等待到下一微任务,降低与其它 UI 的并发竞争 + await Future.delayed(Duration.zero); + try { + await VersionUpdateDialog.show(updateInfo); + } catch (e) { + Logger.e(_tag, '更新弹窗显示失败: $e'); + } } else { Logger.i(_tag, '当前已是最新版本'); } } catch (e) { Logger.e(_tag, '版本检查失败: $e'); - // 即使检查失败,也视为任务完成 } } @@ -278,8 +276,11 @@ class SplashController extends GetxController { Future getLoginToken() async { try { final appVersion = versionService.cachedAppVersion; + final channel = versionService.cachedChannel; + Logger.i(_tag, 'Token登录请求: version=$appVersion, channel=$channel'); final response = await Api.tokenlogin({ 'version': appVersion, + 'channel': channel, }); if (response?['user'] != null && response['user'] != '') { final user = User.fromJson(response); diff --git a/lib/modules/splash/views/splash_view.dart b/lib/modules/splash/views/splash_view.dart index 175606b35..487c4613a 100644 --- a/lib/modules/splash/views/splash_view.dart +++ b/lib/modules/splash/views/splash_view.dart @@ -41,12 +41,13 @@ class SplashView extends GetView { ), // 隐私政策组件 - 添加在底部 - Positioned( - bottom: 90.h, - left: 0, - right: 0, - child: _buildTermsAndPrivacy(isDarkMode), - ), + if (!controller.hasAcceptedPrivacy.value) + Positioned( + bottom: 90.h, + left: 0, + right: 0, + child: _buildTermsAndPrivacy(isDarkMode), + ), // 版本号 //_buildVersionInfo(isDarkMode),