Browse Source

add: get question from database in question page

pull/10/head
AmirrezaChegini 7 days ago
parent
commit
9431d18d2e
  1. 6
      lib/core/routers/my_routes.dart
  2. 4
      lib/features/intro/presentation/bloc/intro_bloc.dart
  3. 1
      lib/features/intro/presentation/ui/widgets/intro_loading_widget.dart
  4. 4
      lib/features/level/domain/usecases/get_levels_usecase.dart
  5. 8
      lib/features/level/presentation/bloc/level_bloc.dart
  6. 30
      lib/features/question/data/datasource/question_datasource.dart
  7. 6
      lib/features/question/data/repository_impl/question_repository_impl.dart
  8. 4
      lib/features/question/domain/repository/question_repository.dart
  9. 10
      lib/features/question/domain/usecases/get_level_usecase.dart
  10. 20
      lib/features/question/presentation/bloc/question_bloc.dart
  11. 6
      lib/features/question/presentation/bloc/question_event.dart
  12. 9
      lib/features/question/presentation/bloc/question_state.dart
  13. 8
      lib/init_bindings.dart

6
lib/core/routers/my_routes.dart

@ -9,6 +9,7 @@ import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_bloc.da
import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_event.dart';
import 'package:hadi_hoda_flutter/features/level/presentation/ui/level_page.dart';
import 'package:hadi_hoda_flutter/features/question/presentation/bloc/question_bloc.dart';
import 'package:hadi_hoda_flutter/features/question/presentation/bloc/question_event.dart';
import 'package:hadi_hoda_flutter/features/question/presentation/ui/question_page.dart';
import 'package:hadi_hoda_flutter/init_bindings.dart';
@ -52,11 +53,12 @@ GoRouter get appPages => GoRouter(
),
),
GoRoute(
name: Routes.questionPage,
path: '${Routes.questionPage}/:id',
builder: (context, state) => BlocProvider(
create: (context) => QuestionBloc(locator()),
create: (context) =>
QuestionBloc(locator())
..add(GetLevelEvent(state.pathParameters['id'])),
child: const QuestionPage(),
),
),

4
lib/features/intro/presentation/bloc/intro_bloc.dart

@ -62,9 +62,7 @@ class IntroBloc extends Bloc<IntroEvent, IntroState> {
},
);
},
(error) {
print(error.errorMessage);
},
(error) {},
);
},
);

1
lib/features/intro/presentation/ui/widgets/intro_loading_widget.dart

@ -38,7 +38,6 @@ class IntroLoadingWidget extends StatelessWidget {
initialData: 0,
stream: loadingStream,
builder: (context, snapshot) {
print(snapshot.data);
return Row(
children: [
Expanded(

4
lib/features/level/domain/usecases/get_level_usecase.dart → lib/features/level/domain/usecases/get_levels_usecase.dart

@ -5,10 +5,10 @@ import 'package:hadi_hoda_flutter/core/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
import 'package:hadi_hoda_flutter/features/level/domain/repository/level_repository.dart';
class GetLevelUseCase implements UseCase<List<LevelEntity>, LevelParams> {
class GetLevelsUseCase implements UseCase<List<LevelEntity>, LevelParams> {
final ILevelRepository repository;
const GetLevelUseCase(this.repository);
const GetLevelsUseCase(this.repository);
@override
Future<DataState<List<LevelEntity>, MyException>> call(LevelParams params) {

8
lib/features/level/presentation/bloc/level_bloc.dart

@ -7,21 +7,21 @@ import 'package:hadi_hoda_flutter/core/routers/my_routes.dart';
import 'package:hadi_hoda_flutter/core/status/base_status.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_location.dart';
import 'package:hadi_hoda_flutter/features/level/domain/usecases/get_level_usecase.dart';
import 'package:hadi_hoda_flutter/features/level/domain/usecases/get_levels_usecase.dart';
import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_event.dart';
import 'package:hadi_hoda_flutter/features/level/presentation/bloc/level_state.dart';
class LevelBloc extends Bloc<LevelEvent, LevelState> {
/// ------------constructor------------
LevelBloc(
this._getLevelUseCase,
this._getLeveslUseCase,
) : super(const LevelState()) {
on<GetLevelListEvent>(_getLevelListEvent);
on<ChooseLevelEvent>(_chooseLevelEvent);
}
/// ------------UseCases------------
final GetLevelUseCase _getLevelUseCase;
final GetLevelsUseCase _getLeveslUseCase;
/// ------------Variables------------
final List<LevelLocation> bottomLocationList = [
@ -74,7 +74,7 @@ class LevelBloc extends Bloc<LevelEvent, LevelState> {
/// ------------Api Calls------------
FutureOr<void> _getLevelListEvent(GetLevelListEvent event,
Emitter<LevelState> emit) async {
await _getLevelUseCase(LevelParams()).then((value) {
await _getLeveslUseCase(LevelParams()).then((value) {
value.fold(
(data) {
bottom8LevelList.addAll(data.take(8));

30
lib/features/question/data/datasource/question_datasource.dart

@ -1,12 +1,12 @@
import 'package:hadi_hoda_flutter/core/constants/my_api.dart';
import 'package:hadi_hoda_flutter/core/constants/my_constants.dart';
import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart';
import 'package:hadi_hoda_flutter/core/network/http_request.dart';
import 'package:hadi_hoda_flutter/core/params/question_params.dart';
import 'package:hadi_hoda_flutter/core/response/base_response.dart';
import 'package:hadi_hoda_flutter/features/question/data/model/question_model.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
import 'package:hive/hive.dart';
abstract class IQuestionDatasource {
Future<QuestionEntity> getData({required QuestionParams params});
Future<LevelEntity> getLevel({required QuestionParams params});
}
class QuestionDatasourceImpl implements IQuestionDatasource {
@ -15,14 +15,16 @@ class QuestionDatasourceImpl implements IQuestionDatasource {
const QuestionDatasourceImpl(this.httpRequest);
@override
Future<QuestionEntity> getData({required QuestionParams params}) async {
final response = await httpRequest.get(
path: MyApi.baseUrl,
);
return BaseResponse.getData<QuestionEntity>(
response?['data'],
(json) => QuestionModel.fromJson(json),
);
Future<LevelEntity> getLevel({required QuestionParams params}) async {
try {
final Box<LevelEntity> levelBox = Hive.box(MyConstants.levelBox);
final LevelEntity findLevel = levelBox.values.singleWhere(
(e) => e.id == params.id,
orElse: () => LevelEntity(),
);
return findLevel;
} catch (e) {
throw MyException(errorMessage: '$e');
}
}
}

6
lib/features/question/data/repository_impl/question_repository_impl.dart

@ -2,8 +2,8 @@ import 'package:hadi_hoda_flutter/core/params/question_params.dart';
import 'package:flutter/foundation.dart';
import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart';
import 'package:hadi_hoda_flutter/core/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
import 'package:hadi_hoda_flutter/features/question/data/datasource/question_datasource.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.dart';
import 'package:hadi_hoda_flutter/features/question/domain/repository/question_repository.dart';
class QuestionRepositoryImpl implements IQuestionRepository {
@ -12,9 +12,9 @@ class QuestionRepositoryImpl implements IQuestionRepository {
const QuestionRepositoryImpl(this.datasource);
@override
Future<DataState<QuestionEntity, MyException>> getData({required QuestionParams params}) async {
Future<DataState<LevelEntity, MyException>> getLevel({required QuestionParams params}) async {
try {
final QuestionEntity response = await datasource.getData(params: params);
final LevelEntity response = await datasource.getLevel(params: params);
return DataState.success(response);
} on MyException catch (e) {
return DataState.error(e);

4
lib/features/question/domain/repository/question_repository.dart

@ -1,8 +1,8 @@
import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart';
import 'package:hadi_hoda_flutter/core/params/question_params.dart';
import 'package:hadi_hoda_flutter/core/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
abstract class IQuestionRepository {
Future<DataState<QuestionEntity, MyException>> getData({required QuestionParams params});
Future<DataState<LevelEntity, MyException>> getLevel({required QuestionParams params});
}

10
lib/features/question/domain/usecases/get_question_usecase.dart → lib/features/question/domain/usecases/get_level_usecase.dart

@ -2,16 +2,16 @@ import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart';
import 'package:hadi_hoda_flutter/core/params/question_params.dart';
import 'package:hadi_hoda_flutter/core/usecase/usecase.dart';
import 'package:hadi_hoda_flutter/core/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
import 'package:hadi_hoda_flutter/features/question/domain/repository/question_repository.dart';
class GetQuestionUseCase implements UseCase<QuestionEntity, QuestionParams> {
class GetLevelUseCase implements UseCase<LevelEntity, QuestionParams> {
final IQuestionRepository repository;
const GetQuestionUseCase(this.repository);
const GetLevelUseCase(this.repository);
@override
Future<DataState<QuestionEntity, MyException>> call(QuestionParams params) {
return repository.getData(params: params);
Future<DataState<LevelEntity, MyException>> call(QuestionParams params) {
return repository.getLevel(params: params);
}
}

20
lib/features/question/presentation/bloc/question_bloc.dart

@ -1,9 +1,9 @@
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:flutter/cupertino.dart';
import 'package:hadi_hoda_flutter/core/params/question_params.dart';
import 'package:hadi_hoda_flutter/core/status/base_status.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.dart';
import 'package:hadi_hoda_flutter/features/question/domain/usecases/get_question_usecase.dart';
import 'package:hadi_hoda_flutter/features/question/domain/usecases/get_level_usecase.dart';
import 'package:hadi_hoda_flutter/features/question/presentation/bloc/question_event.dart';
import 'package:hadi_hoda_flutter/features/question/presentation/bloc/question_state.dart';
import 'package:showcaseview/showcaseview.dart';
@ -11,13 +11,13 @@ import 'package:showcaseview/showcaseview.dart';
class QuestionBloc extends Bloc<QuestionEvent, QuestionState> {
/// ------------constructor------------
QuestionBloc(
this._getQuestionUseCase,
this._getLevelUseCase,
) : super(const QuestionState()) {
on<GetQuestionEvent>(_getQuestionEvent);
on<GetLevelEvent>(_getLevelEvent);
}
/// ------------UseCases------------
final GetQuestionUseCase _getQuestionUseCase;
final GetLevelUseCase _getLevelUseCase;
/// ------------Variables------------
final List<GlobalKey> keys = [
@ -27,6 +27,7 @@ class QuestionBloc extends Bloc<QuestionEvent, QuestionState> {
GlobalKey(),
];
/// ------------Controllers------------
/// ------------Functions------------
@ -35,12 +36,15 @@ class QuestionBloc extends Bloc<QuestionEvent, QuestionState> {
}
/// ------------Api Calls------------
FutureOr<void> _getQuestionEvent(event, emit) async {
await _getQuestionUseCase(event.questionParams).then(
FutureOr<void> _getLevelEvent(GetLevelEvent event, Emitter<QuestionState> emit) async {
await _getLevelUseCase(QuestionParams(id: int.parse(event.id ?? '0'))).then(
(value) {
value.fold(
(data) {
emit(state.copyWith(getQuestionStatus: BaseComplete<QuestionEntity>(data)));
emit(state.copyWith(
getQuestionStatus: BaseComplete(''),
levelEntity: data,
));
},
(error) {
emit(state.copyWith(getQuestionStatus: BaseError(error.errorMessage)));

6
lib/features/question/presentation/bloc/question_event.dart

@ -2,4 +2,8 @@ sealed class QuestionEvent {
const QuestionEvent();
}
class GetQuestionEvent extends QuestionEvent {}
class GetLevelEvent extends QuestionEvent {
final String? id;
const GetLevelEvent(this.id);
}

9
lib/features/question/presentation/bloc/question_state.dart

@ -1,15 +1,22 @@
import 'package:hadi_hoda_flutter/core/status/base_status.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
class QuestionState {
final BaseStatus getQuestionStatus;
final LevelEntity? levelEntity;
const QuestionState({this.getQuestionStatus = const BaseInit()});
const QuestionState({
this.getQuestionStatus = const BaseInit(),
this.levelEntity,
});
QuestionState copyWith({
BaseStatus? getQuestionStatus,
LevelEntity? levelEntity,
}) {
return QuestionState(
getQuestionStatus: getQuestionStatus ?? this.getQuestionStatus,
levelEntity: levelEntity ?? this.levelEntity,
);
}
}

8
lib/init_bindings.dart

@ -17,14 +17,14 @@ import 'package:hadi_hoda_flutter/features/level/data/datasource/level_datasourc
import 'package:hadi_hoda_flutter/features/level/data/repository_impl/level_repository_impl.dart';
import 'package:hadi_hoda_flutter/features/level/domain/entity/level_entity.dart';
import 'package:hadi_hoda_flutter/features/level/domain/repository/level_repository.dart';
import 'package:hadi_hoda_flutter/features/level/domain/usecases/get_level_usecase.dart';
import 'package:hadi_hoda_flutter/features/level/domain/usecases/get_levels_usecase.dart';
import 'package:hadi_hoda_flutter/features/question/data/datasource/question_datasource.dart';
import 'package:hadi_hoda_flutter/features/question/data/repository_impl/question_repository_impl.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/answer_entity.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/file_entity.dart';
import 'package:hadi_hoda_flutter/features/question/domain/entity/question_entity.dart';
import 'package:hadi_hoda_flutter/features/question/domain/repository/question_repository.dart';
import 'package:hadi_hoda_flutter/features/question/domain/usecases/get_question_usecase.dart';
import 'package:hadi_hoda_flutter/features/question/domain/usecases/get_level_usecase.dart';
import 'package:hadi_hoda_flutter/features/sample/data/datasource/sample_datasource.dart';
import 'package:hadi_hoda_flutter/features/sample/data/repository_impl/sample_repository_impl.dart';
import 'package:hadi_hoda_flutter/features/sample/domain/repository/sample_repository.dart';
@ -59,12 +59,12 @@ void initBindings() {
/// Question Feature
locator.registerLazySingleton<IQuestionDatasource>(() => QuestionDatasourceImpl(locator()));
locator.registerLazySingleton<IQuestionRepository>(() => QuestionRepositoryImpl(locator()));
locator.registerLazySingleton<GetQuestionUseCase>(() => GetQuestionUseCase(locator()));
locator.registerLazySingleton<GetLevelUseCase>(() => GetLevelUseCase(locator()));
/// Level Feature
locator.registerLazySingleton<ILevelDatasource>(() => LocalLevelDatasourceImpl());
locator.registerLazySingleton<ILevelRepository>(() => LevelRepositoryImpl(locator()));
locator.registerLazySingleton<GetLevelUseCase>(() => GetLevelUseCase(locator()));
locator.registerLazySingleton<GetLevelsUseCase>(() => GetLevelsUseCase(locator()));
}
Future<void> initDataBase() async {

Loading…
Cancel
Save