This repository has been archived by the owner on Jun 9, 2022. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 258
/
home_page.dart
68 lines (64 loc) · 2.3 KB
/
home_page.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:get/get.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import '../../util/error_snackbar.dart';
import '../app_theme.dart';
import '../component/article_item.dart';
import '../component/loading.dart';
import 'home_view_model.dart';
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(L10n.of(context).home, style: Get.textTheme.headline1),
actions: [
// action button
IconButton(
icon: const Icon(Icons.color_lens),
onPressed: () async => context
.read(appThemeNotifierProvider)
.toggle()
.catchError((error) {
showErrorSnackbar(
L10n.of(context).error, L10n.of(context).failedSwitchTheme);
}),
),
IconButton(
icon: const Icon(Icons.refresh),
onPressed: () =>
context.read(homeViewModelNotifierProvider).fetchNews(),
),
],
),
body: Center(
child: HookBuilder(
builder: (context) {
final homeViewModel = context.read(homeViewModelNotifierProvider);
final news = useProvider(
homeViewModelNotifierProvider.select((value) => value.news));
final snapshot = useFuture(
useMemoized(homeViewModel.fetchNews, [news.toString()]));
if (snapshot.connectionState == ConnectionState.waiting) {
return const Loading();
}
return news.when(success: (data) {
if (data.articles.isEmpty) {
return const Text('Empty screen');
}
return ListView.builder(
itemCount: data.articles.length,
itemBuilder: (_, index) {
return ArticleItem(data.articles[index]);
},
);
}, failure: (e) {
return Text('Error Screen: $e');
});
},
),
));
}
}