Skip to content

Commit 736f8e7

Browse files
committed
fix(*)
1 parent 490a49c commit 736f8e7

3 files changed

Lines changed: 93 additions & 57 deletions

File tree

lib/common/global/initialized.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,12 @@ class AppInitializer {
8484
void initService() {
8585
Get.put(SettingsService(), permanent: true);
8686
Get.put(AuthController(), permanent: true);
87-
Get.put(FavoriteController(), permanent: true);
88-
Get.put(BiliBiliAccountService(), permanent: true);
89-
Get.put(PopularController(), permanent: true);
90-
Get.put(AreasController(), permanent: true);
91-
Get.put(GlobalPlayerState(), permanent: true);
87+
88+
Get.lazyPut(() => FavoriteController(), fenix: true);
89+
Get.lazyPut(() => BiliBiliAccountService(), fenix: true);
90+
Get.lazyPut(() => PopularController(), fenix: true);
91+
Get.lazyPut(() => AreasController(), fenix: true);
92+
Get.lazyPut(() => GlobalPlayerState(), fenix: true);
9293
}
9394

9495
bool get isInitialized => _isInitialized;

lib/modules/areas/areas_controller.dart

Lines changed: 46 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,58 @@ class AreasController extends GetxController with GetSingleTickerProviderStateMi
66
late TabController tabController;
77
int index = 0;
88
final isCustomSite = false.obs;
9-
AreasController() {
9+
late List<dynamic> sites;
10+
11+
@override
12+
void onInit() {
13+
super.onInit();
14+
sites = Sites().availableSites();
15+
1016
final preferPlatform = Get.find<SettingsService>().preferPlatform.value;
11-
final pIndex = Sites().availableSites().indexWhere((e) => e.id == preferPlatform);
12-
tabController = TabController(
13-
initialIndex: pIndex == -1 ? 0 : pIndex,
14-
length: Sites().availableSites().length,
15-
vsync: this,
16-
);
17+
final pIndex = sites.indexWhere((e) => e.id == preferPlatform);
1718
index = pIndex == -1 ? 0 : pIndex;
18-
tabController.animation?.addListener(() {
19-
var currentIndex = (tabController.animation?.value ?? 0).round();
20-
if (index == currentIndex) {
21-
return;
22-
}
23-
index = currentIndex;
24-
var controller = Get.find<AreasListController>(tag: Sites().availableSites()[index].id);
25-
isCustomSite.value = controller.site.id == 'custom';
26-
if (controller.list.isEmpty) {
27-
controller.loadData();
28-
}
29-
});
19+
20+
tabController = TabController(length: sites.length, vsync: this);
21+
22+
for (var site in sites) {
23+
Get.lazyPut(() => AreasListController(site), tag: site.id);
24+
}
25+
26+
if (index > 0) {
27+
WidgetsBinding.instance.addPostFrameCallback((_) {
28+
tabController.animateTo(index);
29+
_loadCurrentTabData(index);
30+
});
31+
} else {
32+
_loadCurrentTabData(0);
33+
}
34+
35+
tabController.addListener(_handleTabChange);
3036
}
3137

32-
@override
33-
void onInit() async {
34-
for (var site in Sites().availableSites()) {
35-
Get.put(AreasListController(site), tag: site.id);
36-
var controller = Get.find<AreasListController>(tag: site.id);
37-
if (controller.list.isEmpty) {
38-
controller.loadData();
38+
void _handleTabChange() {
39+
if (!tabController.indexIsChanging) {
40+
if (index != tabController.index) {
41+
index = tabController.index;
42+
_loadCurrentTabData(index);
3943
}
4044
}
45+
}
4146

42-
super.onInit();
47+
void _loadCurrentTabData(int i) {
48+
var siteId = sites[i].id;
49+
isCustomSite.value = siteId == 'custom';
50+
// 只有在真的需要时才去找 Controller 并触发 loadData
51+
var listController = Get.find<AreasListController>(tag: siteId);
52+
if (listController.list.isEmpty) {
53+
listController.loadData();
54+
}
55+
}
56+
57+
@override
58+
void onClose() {
59+
tabController.removeListener(_handleTabChange);
60+
tabController.dispose();
61+
super.onClose();
4362
}
4463
}

lib/modules/popular/popular_controller.dart

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,40 +7,56 @@ import 'package:pure_live/modules/popular/popular_grid_controller.dart';
77
class PopularController extends GetxController with GetSingleTickerProviderStateMixin {
88
late TabController tabController;
99
int index = 0;
10+
late List<dynamic> sites;
11+
12+
@override
13+
void onInit() {
14+
super.onInit();
15+
sites = Sites().availableSites();
1016

11-
PopularController() {
1217
final preferPlatform = Get.find<SettingsService>().preferPlatform.value;
13-
final pIndex = Sites().availableSites().indexWhere((e) => e.id == preferPlatform);
14-
tabController = TabController(
15-
initialIndex: pIndex == -1 ? 0 : pIndex,
16-
length: Sites().availableSites().length,
17-
vsync: this,
18-
);
18+
final pIndex = sites.indexWhere((e) => e.id == preferPlatform);
1919
index = pIndex == -1 ? 0 : pIndex;
2020

21-
tabController.animation?.addListener(() {
22-
var currentIndex = (tabController.animation?.value ?? 0).round();
23-
if (index == currentIndex) {
24-
return;
25-
}
21+
tabController = TabController(length: sites.length, vsync: this);
2622

27-
index = currentIndex;
28-
var controller = Get.find<PopularGridController>(tag: Sites().availableSites()[index].id);
23+
for (var site in sites) {
24+
Get.lazyPut(() => PopularGridController(site), tag: site.id);
25+
}
2926

30-
if (controller.list.isEmpty) {
31-
controller.loadData();
32-
}
33-
});
27+
if (index > 0) {
28+
WidgetsBinding.instance.addPostFrameCallback((_) {
29+
tabController.animateTo(index);
30+
_loadDataAtIndex(index);
31+
});
32+
} else {
33+
_loadDataAtIndex(0);
34+
}
35+
36+
tabController.addListener(_handleTabChange);
3437
}
3538

36-
@override
37-
void onInit() {
38-
for (var site in Sites().availableSites()) {
39-
var controller = Get.put(PopularGridController(site), tag: site.id);
40-
if (controller.list.isEmpty) {
41-
controller.loadData();
39+
void _handleTabChange() {
40+
if (!tabController.indexIsChanging) {
41+
if (index != tabController.index) {
42+
index = tabController.index;
43+
_loadDataAtIndex(index);
4244
}
4345
}
44-
super.onInit();
46+
}
47+
48+
void _loadDataAtIndex(int i) {
49+
var siteId = sites[i].id;
50+
var controller = Get.find<PopularGridController>(tag: siteId);
51+
if (controller.list.isEmpty) {
52+
controller.loadData();
53+
}
54+
}
55+
56+
@override
57+
void onClose() {
58+
tabController.removeListener(_handleTabChange);
59+
tabController.dispose();
60+
super.onClose();
4561
}
4662
}

0 commit comments

Comments
 (0)