Browse Source

Merge branch 'new_dev' of https://github.com/deepcloud2048/deep_voice into new_dev

newdev_shunjiawei
liwei1dao 12 months ago
parent
commit
b400c91d58
  1. 73
      lib/data/services/version_update_service.dart
  2. 84
      lib/modules/meeting/views/template/template_edit_view.dart
  3. 79
      lib/modules/meeting/views/template/template_view.dart
  4. 28
      lib/modules/settings/controllers/settings_controller.dart
  5. 47
      lib/modules/splash/controllers/splash_controller.dart
  6. 13
      lib/modules/splash/views/splash_view.dart

73
lib/data/services/version_update_service.dart

@ -119,6 +119,9 @@ class VersionUpdateService extends GetxService {
}
/// 根据设备品牌获取应用商店信息
///
/// 该方法根据设备品牌判断应用商店类型,并返回对应的 [PlatformInfo] 对象。
/// 如果品牌不在预设列表中,将使用环境变量 [Channel] 或默认值 [UserChannel.GLOBAL_GOOGLE]。
Future<PlatformInfo> 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字段

84
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<TemplateEditView> createState() => _TemplateEditViewState();
}
class _TemplateEditViewState extends State<TemplateEditView> {
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,
),
),
),
),
),
],
);
}
}

79
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<TemplateView> {
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<TemplateView> {
);
}
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<TemplateView> {
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<TemplateView> {
),
);
}
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,
),
),
),
],
),
),
),
);
}
}

28
lib/modules/settings/controllers/settings_controller.dart

@ -629,20 +629,20 @@ class SettingsController extends GetxController {
try {
final versionService = Get.find<VersionUpdateService>();
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';

47
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<bool> _checkAndRequestPrivacy() async {
if (_storage.read<bool>('hasAcceptedPrivacy') ?? false) {
_hasAcceptedPrivacy.value = true;
if (_hasAcceptedPrivacy.value) {
return true;
}
@ -101,7 +100,6 @@ class SplashController extends GetxController {
return completer.future;
}
/// 网络连接检查
/// 网络连接检查 - 阻塞版本
Future<void> _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<void>();
// 在主线程中显示更新对话框
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<bool> 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);

13
lib/modules/splash/views/splash_view.dart

@ -41,12 +41,13 @@ class SplashView extends GetView<SplashController> {
),
// 隐私政策组件 - 添加在底部
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),

Loading…
Cancel
Save