Skip to content

Commit 5321d54

Browse files
committed
explore page loading fix
1 parent d4b9ab3 commit 5321d54

2 files changed

Lines changed: 92 additions & 35 deletions

File tree

lib/features/explore/presentation/controller/explore_controller.dart

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,15 @@ class ExploreController extends ChangeNotifier {
1616
List<TrendingTagModel> tags = [];
1717
List<TrendingAuthorModel> authors = [];
1818

19+
bool _authorsLoaded = false;
20+
1921
ExploreController()
2022
: threadType = getIt<SettingsRepository>().readDefaultThread() {
21-
loadData();
23+
_loadTags();
2224
}
2325

24-
Future<void> loadData() async {
26+
Future<void> _loadTags() async {
2527
tagsState = ViewState.loading;
26-
authorsState = ViewState.loading;
2728
notifyListeners();
2829

2930
final container = _getContainer();
@@ -35,26 +36,47 @@ class ExploreController extends ChangeNotifier {
3536
tags = [];
3637
tagsState = ViewState.error;
3738
}
39+
notifyListeners();
40+
}
41+
42+
Future<void> loadAuthorsIfNeeded() async {
43+
if (_authorsLoaded) {
44+
return;
45+
}
46+
47+
authorsState = ViewState.loading;
48+
notifyListeners();
3849

50+
final container = _getContainer();
3951
final authorRes = await _repository.getTrendingAuthors(container);
4052
if (authorRes.isSuccess && authorRes.data != null &&
4153
authorRes.data!.isNotEmpty) {
4254
authors = authorRes.data!;
4355
authorsState = ViewState.data;
56+
_authorsLoaded = true;
4457
} else {
4558
authors = [];
4659
authorsState = ViewState.error;
60+
_authorsLoaded = false;
4761
}
4862
notifyListeners();
4963
}
5064

5165
void onChangeThreadType(ThreadFeedType type) {
5266
if (threadType != type) {
5367
threadType = type;
54-
loadData();
68+
_resetAuthors();
69+
_loadTags();
5570
}
5671
}
5772

73+
void _resetAuthors() {
74+
authors = [];
75+
authorsState = ViewState.loading;
76+
_authorsLoaded = false;
77+
notifyListeners();
78+
}
79+
5880
String _getContainer() {
5981
switch (threadType) {
6082
case ThreadFeedType.ecency:

lib/features/explore/presentation/view/explore_view.dart

Lines changed: 66 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -12,43 +12,78 @@ import 'package:waves/features/explore/models/trending_tag_model.dart';
1212
import 'package:waves/features/explore/presentation/controller/explore_controller.dart';
1313
import 'package:waves/features/explore/presentation/widgets/thread_type_dropdown.dart';
1414

15-
class ExploreView extends StatelessWidget {
15+
class ExploreView extends StatefulWidget {
1616
const ExploreView({super.key});
1717

18+
@override
19+
State<ExploreView> createState() => _ExploreViewState();
20+
}
21+
22+
class _ExploreViewState extends State<ExploreView>
23+
with SingleTickerProviderStateMixin {
24+
late final TabController _tabController;
25+
late final ExploreController _exploreController;
26+
27+
@override
28+
void initState() {
29+
super.initState();
30+
_exploreController = ExploreController();
31+
_tabController = TabController(length: 2, vsync: this);
32+
_tabController.addListener(_onTabChange);
33+
}
34+
35+
@override
36+
void dispose() {
37+
_tabController.removeListener(_onTabChange);
38+
_tabController.dispose();
39+
_exploreController.dispose();
40+
super.dispose();
41+
}
42+
43+
void _onTabChange() {
44+
if (!_tabController.indexIsChanging && _tabController.index == 1) {
45+
_exploreController.loadAuthorsIfNeeded();
46+
}
47+
}
48+
1849
@override
1950
Widget build(BuildContext context) {
20-
return DefaultTabController(
21-
length: 2,
22-
child: ChangeNotifierProvider(
23-
create: (_) => ExploreController(),
24-
child: Consumer<ExploreController>(
25-
builder: (context, controller, _) {
26-
return Scaffold(
27-
appBar: AppBar(
28-
title: ThreadTypeDropdown(
29-
value: controller.threadType,
30-
onChanged: controller.onChangeThreadType,
31-
),
32-
bottom: TabBar(
33-
tabs: [
34-
Tab(text: LocaleText.tags),
35-
Tab(text: LocaleText.users),
36-
],
37-
),
51+
return ChangeNotifierProvider.value(
52+
value: _exploreController,
53+
child: Consumer<ExploreController>(
54+
builder: (context, controller, _) {
55+
return Scaffold(
56+
appBar: AppBar(
57+
title: ThreadTypeDropdown(
58+
value: controller.threadType,
59+
onChanged: (type) {
60+
controller.onChangeThreadType(type);
61+
if (_tabController.index == 1) {
62+
controller.loadAuthorsIfNeeded();
63+
}
64+
},
3865
),
39-
body: SafeArea(
40-
top: false,
41-
bottom: false,
42-
child: TabBarView(
43-
children: [
44-
_TagsTab(),
45-
_UsersTab(),
46-
],
47-
),
66+
bottom: TabBar(
67+
controller: _tabController,
68+
tabs: [
69+
Tab(text: LocaleText.tags),
70+
Tab(text: LocaleText.users),
71+
],
4872
),
49-
);
50-
},
51-
),
73+
),
74+
body: SafeArea(
75+
top: false,
76+
bottom: false,
77+
child: TabBarView(
78+
controller: _tabController,
79+
children: [
80+
_TagsTab(),
81+
_UsersTab(),
82+
],
83+
),
84+
),
85+
);
86+
},
5287
),
5388
);
5489
}

0 commit comments

Comments
 (0)