Skip to content

Commit 236ee50

Browse files
committed
posts page added
1 parent eb88149 commit 236ee50

35 files changed

+573
-174
lines changed

lib/app.dart

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_bloc/flutter_bloc.dart';
3+
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
4+
import 'package:flutter_localizations/flutter_localizations.dart';
5+
6+
import 'bloc/language/language_cubit.dart';
7+
import 'bloc/post/post_cubit.dart';
8+
import 'bloc/theme/theme_cubit.dart';
9+
import 'constants/app_themes.dart';
10+
import 'constants/supported_locales.dart';
11+
import 'data/repositories/post_repository.dart';
12+
import 'presentation/pages/posts/posts_page.dart';
13+
14+
class App extends StatelessWidget {
15+
@override
16+
Widget build(BuildContext context) {
17+
final themeMode = context.watch<ThemeCubit>().state;
18+
final locale = context.watch<LanguageCubit>().state;
19+
20+
return MaterialApp(
21+
title: 'Placeholder Title',
22+
debugShowCheckedModeBanner: false,
23+
themeMode: themeMode,
24+
theme: AppThemes.lightTheme,
25+
darkTheme: AppThemes.darkTheme,
26+
locale: locale,
27+
supportedLocales: supportedLocales,
28+
localizationsDelegates: [
29+
GlobalMaterialLocalizations.delegate,
30+
GlobalWidgetsLocalizations.delegate,
31+
GlobalCupertinoLocalizations.delegate,
32+
AppLocalizations.delegate,
33+
],
34+
home: Navigator(
35+
pages: [
36+
MaterialPage(
37+
child: RepositoryProvider(
38+
create: (_) => PostRepository(),
39+
child: BlocProvider(
40+
create: (ctx) => PostCubit(
41+
ctx.read<PostRepository>(),
42+
)..fetch(),
43+
child: PostsPage(),
44+
),
45+
),
46+
),
47+
],
48+
onPopPage: (route, result) {
49+
if (route.didPop(result)) {
50+
return true;
51+
}
52+
53+
return false;
54+
},
55+
),
56+
);
57+
}
58+
}

lib/bloc/data/data_cubit.dart

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import 'dart:async';
2+
3+
import 'package:equatable/equatable.dart';
4+
import 'package:flutter_bloc/flutter_bloc.dart';
5+
import 'package:logging/logging.dart';
6+
7+
part 'data_state.dart';
8+
9+
abstract class DataCubit<T> extends Cubit<DataState<T>> {
10+
final _logger = Logger('DataCubit<$T>');
11+
12+
DataCubit() : super(DataState<T>());
13+
14+
bool get emitInProgress => true;
15+
16+
FutureOr<T> loadData();
17+
18+
void fetch() async {
19+
emit(state.inProgress());
20+
21+
try {
22+
final data = await loadData();
23+
24+
if (data != null) {
25+
_logger.fine('$data');
26+
emit(state.success(data));
27+
} else {
28+
_logger.warning('data is null!');
29+
emit(state.failure());
30+
}
31+
} catch (e, s) {
32+
_logger.severe('$e => $s');
33+
}
34+
}
35+
}

lib/bloc/data/data_state.dart

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
part of 'data_cubit.dart';
2+
3+
class DataState<T> extends Equatable {
4+
DataState({
5+
this.isInProgress = false,
6+
this.isFailure = false,
7+
this.isSuccess = false,
8+
this.data,
9+
});
10+
11+
final bool isInProgress;
12+
final bool isFailure;
13+
final bool isSuccess;
14+
final T? data;
15+
16+
DataState<T> inProgress() => _copyWith(isInProgress: true);
17+
18+
DataState<T> failure() => _copyWith(isFailure: true);
19+
20+
DataState<T> success(T data) => _copyWith(isSuccess: true, data: data);
21+
22+
DataState<T> _copyWith({
23+
final bool? isInProgress,
24+
final bool? isFailure,
25+
final bool? isSuccess,
26+
final T? data,
27+
}) =>
28+
DataState(
29+
isInProgress: isInProgress ?? false,
30+
isFailure: isFailure ?? false,
31+
isSuccess: isSuccess ?? false,
32+
data: data,
33+
);
34+
35+
@override
36+
List<Object?> get props => [isInProgress, isFailure, isSuccess, data];
37+
}

lib/bloc/language/language_cubit.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_bloc/flutter_bloc.dart';
33

4-
import '../../contractors/impl_preferences_service.dart';
4+
import '../../contractors/base_preferences_service.dart';
55

66
class LanguageCubit extends Cubit<Locale> {
77
LanguageCubit(this.preferencesService) : super(Locale('en', 'US')) {
88
final locale = preferencesService.locale;
99
emit(locale ?? Locale('en', 'US'));
1010
}
1111

12-
final ImplPreferencesService preferencesService;
12+
final BasePreferencesService preferencesService;
1313

1414
void changeLocale(Locale locale) async {
1515
if (state == locale) {

lib/bloc/post/post_cubit.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import 'dart:async';
2+
3+
import '../../contractors/base_post_repository.dart';
4+
import '../../data/models/post.dart';
5+
import '../data/data_cubit.dart';
6+
7+
export '../data/data_cubit.dart';
8+
export '../../data/models/post.dart';
9+
10+
class PostCubit extends DataCubit<List<Post>> {
11+
PostCubit(this.postRepository);
12+
13+
final BasePostRepository postRepository;
14+
15+
@override
16+
FutureOr<List<Post>> loadData() => postRepository.getPosts();
17+
}

lib/bloc/theme/theme_cubit.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_bloc/flutter_bloc.dart';
33

4-
import '../../contractors/impl_preferences_service.dart';
4+
import '../../contractors/base_preferences_service.dart';
55

66
class ThemeCubit extends Cubit<ThemeMode> {
77
ThemeCubit(this.preferencesService) : super(ThemeMode.system) {
88
emit(preferencesService.themeMode ?? ThemeMode.system);
99
}
1010

11-
ImplPreferencesService preferencesService;
11+
BasePreferencesService preferencesService;
1212

1313
void changeTheme(ThemeMode themeMode) async {
1414
if (state == themeMode) {

lib/config/init.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
import 'package:dio/dio.dart';
12
import 'package:flutter/material.dart';
23
import 'package:flutter_bloc/flutter_bloc.dart';
34

45
import '../bloc/app_bloc_observer.dart';
6+
import '../data/data_providers/post_data_provider.dart';
7+
import '../locator.dart';
58
import '../services/logging_service.dart';
69
import '../services/preferences_service.dart';
710
import 'config.dart';
@@ -18,4 +21,12 @@ Future<void> init() async {
1821
}
1922

2023
await PreferencesService.init();
24+
await _initDataProviders();
25+
}
26+
27+
Future<void> _initDataProviders() async {
28+
final locator = Locator.instance;
29+
final dio = Dio();
30+
31+
locator.register<PostDataProvider>(PostDataProvider(dio));
2132
}

lib/presentation/values/app_colors.dart renamed to lib/constants/app_colors.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import 'package:flutter/material.dart';
33
abstract class AppColors {
44
AppColors._();
55

6-
static const primaryColor = Colors.orange;
6+
static const primaryColor = Colors.deepPurple;
77
static const darkPrimaryColor = Colors.black;
88

9-
static const primaryColorLight = Colors.orangeAccent;
9+
static const primaryColorLight = Colors.deepPurple;
1010
static const darkPrimaryColorLight = Colors.black45;
1111

12-
static const primaryColorDark = Colors.deepOrange;
12+
static const primaryColorDark = Colors.deepPurple;
1313

14-
static const scaffoldColor = Colors.white;
14+
static const scaffoldColor = Colors.grey;
1515
static const darkScaffoldColor = Colors.black;
1616
}

0 commit comments

Comments
 (0)