@@ -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}
0 commit comments