import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:injectable/injectable.dart'; import 'package:keyboard/base/base_controller.dart'; import 'package:keyboard/data/repository/account_repository.dart'; import 'package:keyboard/data/repository/characters_repository.dart'; import 'package:keyboard/dialog/character_details_dialog.dart'; import 'package:keyboard/module/character/character_controller.dart'; import 'package:keyboard/module/store/store_page.dart'; import 'package:keyboard/utils/atmob_log.dart'; import 'package:keyboard/utils/http_handler.dart'; import 'package:keyboard/utils/toast_util.dart'; import '../../../data/bean/character_group_info.dart'; import '../../../data/bean/character_info.dart'; import '../../../data/bean/keyboard_info.dart'; import '../../../utils/error_handler.dart'; @injectable class CharacterGroupContentController extends BaseController { final tag = "CharacterGroupContentController"; Rx get currentKeyboardInfo => Get.find().currentKeyboardInfo; Rx get currentCharacterGroupInfo => Get.find().currentCharacterGroupInfo; final CharactersRepository charactersRepository; final AccountRepository accountRepository; bool get isLogin => accountRepository.isLogin.value; CharacterGroupContentController( this.charactersRepository, this.accountRepository, ); RxList characterList = [].obs; RxInt currentListCount = 0.obs; RxInt currentPage = 1.obs; late EasyRefreshController refreshController; @override void onInit() async { super.onInit(); refreshController = EasyRefreshController( controlFinishLoad: true, controlFinishRefresh: true, ); // 等待页面渲染完成后再加载数据 WidgetsBinding.instance.addPostFrameCallback((_) { refreshData(); }); everAll([currentCharacterGroupInfo, currentKeyboardInfo], (_) async { await refreshData(); }); } @override onReady() { super.onReady(); } // 下拉刷新 Future refreshData() async { AtmobLog.d( tag, 'refreshData ${currentCharacterGroupInfo.value.id}, ${currentKeyboardInfo.value.id}', ); currentPage.value = 1; await getCurrentCharacterListInfo(isRefresh: true); refreshController.finishRefresh(); refreshController.resetFooter(); // 允许加载更多 } // 上拉加载更多 Future loadMoreData() async { if (characterList.length >= currentListCount.value) { refreshController.finishLoad(IndicatorResult.noMore); return; } currentPage.value++; await getCurrentCharacterListInfo(isRefresh: false); refreshController.finishLoad(IndicatorResult.success); } // 获取角色列表 Future getCurrentCharacterListInfo({bool isRefresh = false}) async { var response = await charactersRepository.getCharactersPage( groupId: currentCharacterGroupInfo.value.id.toString(), page: currentPage.value, keyboardId: currentKeyboardInfo.value.id.toString(), ); if (isRefresh) { characterList.value = response.characterInfos; } else { characterList.addAll(response.characterInfos); } currentListCount.value = response.count; } @override void onClose() { refreshController.dispose(); super.onClose(); } void itemButtonClick(CharacterInfo characterInfo) { AtmobLog.d(tag, 'characterInfo ${characterInfo.toJson()} '); if (isLogin == false) { ToastUtil.show('请先登录~'); return; } CharacterDetailsDialog.show( characterInfo: characterInfo, clickCallback: () { if (characterInfo.isVip == true && characterInfo.isLock == true) { unlockCharacter(characterInfo); } else if (characterInfo.isAdd == false) { addCharacter(characterInfo); } }, ); } Future addCharacter(CharacterInfo characterInfo) async { try { final characterAddResponse = await charactersRepository.characterAdd( characterId: characterInfo.id.toString(), keyboardId: currentKeyboardInfo.value.id.toString(), ); int index = characterList.indexWhere( (element) => element.id == characterAddResponse.characterInfo.id, ); if (index != -1) { characterList[index] = characterAddResponse.characterInfo; } ToastUtil.show('添加成功~'); } catch (error) { if (error is ServerErrorException) { if (error.code == 1005) { StorePage.start(); ToastUtil.show(error.message); } else { ToastUtil.show(error.message); } } else { ErrorHandler.toastError(error); } } } void unlockCharacter(CharacterInfo characterInfo) { charactersRepository .characterUnlock( characterId: characterInfo.id.toString(), keyboardId: currentKeyboardInfo.value.id.toString(), ) .then((characterUnlockResponse) { int index = characterList.indexWhere( (element) => element.id == characterUnlockResponse.characterInfo.id, ); if (index != -1) { characterList[index] = characterUnlockResponse.characterInfo; } ToastUtil.show('解锁成功~'); }) .catchError((error) { if (error is ServerErrorException) { if (error.code == 1005) { ToastUtil.show('请开通会员解锁权益~'); StorePage.start(); } ToastUtil.show(error.message); } else { ErrorHandler.toastError(error); } }); } }