import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/main/lockDetail/lockDetail/passthrough_item.dart'; import 'package:star_lock/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_logic.dart'; import 'package:star_lock/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_state.dart'; import 'package:star_lock/tools/EasyRefreshTool.dart'; import 'package:star_lock/tools/commonItem.dart'; import 'package:star_lock/tools/titleAppBar.dart'; class SpeechLanguageSettingsPage extends StatefulWidget { const SpeechLanguageSettingsPage(); @override State createState() => _SpeechLanguageSettingsPageState(); } class _SpeechLanguageSettingsPageState extends State { final SpeechLanguageSettingsLogic logic = Get.put(SpeechLanguageSettingsLogic()); final SpeechLanguageSettingsState state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( barTitle: '锁语音包设置'.tr, haveBack: true, backgroundColor: AppColors.mainColor, actionsList: [ TextButton( onPressed: logic.saveSpeechLanguageSettings, child: Text( '下载'.tr, style: TextStyle( color: Colors.white, fontSize: 24.sp, fontWeight: FontWeight.w500, ), ), ), ], ), body: Obx( () => ListView( padding: EdgeInsets.zero, children: [ // 语音类型选择区 Container( color: Colors.white, child: Column( children: List.generate( state.soundTypeList.length, (index) { final isLastItem = index == state.soundTypeList.length - 1; final soundType = state.soundTypeList.value[index]; return CommonItem( leftTitel: soundType, rightTitle: '', isHaveLine: !isLastItem, isHaveDirection: false, isHaveRightWidget: true, rightWidget: Radio( value: soundType, groupValue: state.soundTypeList .value[state.selectSoundTypeIndex.value], activeColor: AppColors.mainColor, onChanged: (value) { if (value != null) { final newIndex = state.soundTypeList.value .indexWhere((p) => p == value); if (newIndex != -1) { state.selectSoundTypeIndex.value = newIndex; } } }, ), action: () { state.selectSoundTypeIndex.value = index; }, ); }, ), ), ), SizedBox( height: 8.h, ), // 语言包列表区 Container( color: Colors.transparent, child: Column( children: List.generate( state.languages.length, (index) { final item = state.languages[index]; return CommonItem( leftTitel: item.langText, rightTitle: '', isHaveLine: true, isHaveDirection: false, isHaveRightWidget: true, rightWidget: state.selectPassthroughListIndex.value == index ? Image( image: const AssetImage( 'images/icon_item_checked.png'), width: 30.w, height: 30.w, fit: BoxFit.contain, ) : Container(), action: () { state.selectPassthroughListIndex.value = index; }, ); }, ), ), ), ], ), ), ); } Widget _buildBody() { return Obx( () => SingleChildScrollView( child: Column( children: [ ListView.builder( itemCount: state.soundTypeList.length, itemBuilder: (BuildContext context, int index) { // 判断是否是最后一个元素(索引等于 itemCount - 1) final isLastItem = index == state.soundTypeList.length - 1; // 获取当前平台数据(假设 platFormSet 是 RxList) final platform = state.soundTypeList.value[index]; return CommonItem( leftTitel: state.soundTypeList.value[index], rightTitle: '', isHaveLine: !isLastItem, // 最后一个元素不显示分割线(取反) isHaveDirection: false, isHaveRightWidget: true, rightWidget: Radio( // Radio 的值:使用平台的唯一标识(如 id) value: platform, // 当前选中的值:与 selectPlatFormIndex 关联的 id groupValue: state.soundTypeList .value[state.selectSoundTypeIndex.value], // 选中颜色(可选,默认主题色) activeColor: AppColors.mainColor, // 点击 Radio 时回调(更新选中索引) onChanged: (value) { if (value != null) { setState(() { // 找到当前选中平台的索引(根据 id 匹配) final newIndex = state.soundTypeList.value .indexWhere((p) => p == value); if (newIndex != -1) { state.selectSoundTypeIndex.value = newIndex; } }); } }, ), action: () { setState(() { state.selectSoundTypeIndex.value = index; }); }, ); }, shrinkWrap: true, physics: const NeverScrollableScrollPhysics() //add this line, ), Column( children: _buildList(), ), ], ), ), ); } List _buildList() { final appLocalLanguages = state.languages; return List.generate( appLocalLanguages.length, (index) => _buildItem( appLocalLanguages[index], index, ), ); } @override void dispose() { super.dispose(); if (EasyLoading.isShow) { EasyLoading.dismiss(animation: true); } } _buildItem(PassthroughItem item, index) { return CommonItem( leftTitel: item.langText, rightTitle: '', isHaveLine: true, isHaveDirection: false, isHaveRightWidget: true, rightWidget: state.selectPassthroughListIndex.value == index ? Image( image: const AssetImage('images/icon_item_checked.png'), width: 30.w, height: 30.w, fit: BoxFit.contain, ) : Container(), action: () { state.selectPassthroughListIndex.value = index; }, ); } }