initalizing the mobile apps
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
# Feature Manifest: Template Feature
|
||||
|
||||
## Overview
|
||||
**Feature Name:** Template Feature
|
||||
**Package Path:** `packages/features/shared/template_feature`
|
||||
**Owner:** [Team Name/Agent]
|
||||
|
||||
## Responsibilities
|
||||
* Describe what this feature does.
|
||||
* Describe what this feature does NOT do.
|
||||
|
||||
## Architecture
|
||||
* **Domain**:
|
||||
* `TemplateEntity` (imported from `krow_domain`)
|
||||
* `TemplateRepositoryInterface`
|
||||
* **Data**:
|
||||
* `TemplateRepositoryImpl` (uses `krow_data_connect`)
|
||||
* **Presentation**:
|
||||
* `TemplatePage`
|
||||
* `TemplateBloc`
|
||||
|
||||
## Dependencies
|
||||
* `krow_domain`: For entities.
|
||||
* `krow_data_connect`: For backend mocking/access.
|
||||
* `design_system`: For UI components.
|
||||
|
||||
## Routes
|
||||
* `/`: Main template page.
|
||||
* `/:id`: Detail page (example).
|
||||
@@ -0,0 +1,20 @@
|
||||
import 'package:krow_data_connect/krow_data_connect.dart';
|
||||
import 'package:krow_domain/krow_domain.dart';
|
||||
import '../../domain/repositories/template_repository_interface.dart';
|
||||
|
||||
class TemplateRepositoryImpl implements TemplateRepositoryInterface {
|
||||
// In a real scenario, you might inject a specific DataSource here.
|
||||
// For now, we can use the static/singleton mocks from krow_data_connect or inject them.
|
||||
final AuthRepositoryMock _authMock;
|
||||
|
||||
TemplateRepositoryImpl({AuthRepositoryMock? authMock})
|
||||
: _authMock = authMock ?? AuthRepositoryMock();
|
||||
|
||||
@override
|
||||
Future<User?> getData() async {
|
||||
// Mapping from DataConnect models to Domain models happens here if needed.
|
||||
// For the mock stage, we just return the entity.
|
||||
final result = await _authMock.currentUser.first;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
import 'package:krow_domain/krow_domain.dart';
|
||||
|
||||
/// Abstract interface for data access.
|
||||
/// Must be implemented in the Data layer.
|
||||
abstract interface class TemplateRepositoryInterface {
|
||||
Future<User?> getData();
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
import 'package:krow_core/krow_core.dart'; // Assuming Result/UseCases might be here later
|
||||
import 'package:krow_domain/krow_domain.dart';
|
||||
import '../repositories/template_repository_interface.dart';
|
||||
|
||||
class GetTemplateDataUseCase {
|
||||
final TemplateRepositoryInterface _repository;
|
||||
|
||||
GetTemplateDataUseCase(this._repository);
|
||||
|
||||
Future<User?> call() async {
|
||||
return _repository.getData();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:krow_domain/krow_domain.dart';
|
||||
import '../../domain/usecases/get_template_data_usecase.dart';
|
||||
|
||||
// Events
|
||||
abstract class TemplateEvent extends Equatable {
|
||||
const TemplateEvent();
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class TemplateStarted extends TemplateEvent {}
|
||||
|
||||
// States
|
||||
abstract class TemplateState extends Equatable {
|
||||
const TemplateState();
|
||||
@override
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
|
||||
class TemplateInitial extends TemplateState {}
|
||||
class TemplateLoading extends TemplateState {}
|
||||
class TemplateLoaded extends TemplateState {
|
||||
final User user;
|
||||
const TemplateLoaded(this.user);
|
||||
@override
|
||||
List<Object?> get props => [user];
|
||||
}
|
||||
class TemplateError extends TemplateState {
|
||||
final String message;
|
||||
const TemplateError(this.message);
|
||||
@override
|
||||
List<Object?> get props => [message];
|
||||
}
|
||||
|
||||
// BLoC
|
||||
class TemplateBloc extends Bloc<TemplateEvent, TemplateState> {
|
||||
final GetTemplateDataUseCase _getDataUseCase;
|
||||
|
||||
TemplateBloc({required GetTemplateDataUseCase getDataUseCase})
|
||||
: _getDataUseCase = getDataUseCase,
|
||||
super(TemplateInitial()) {
|
||||
on<TemplateStarted>(_onStarted);
|
||||
}
|
||||
|
||||
Future<void> _onStarted(TemplateStarted event, Emitter<TemplateState> emit) async {
|
||||
emit(TemplateLoading());
|
||||
try {
|
||||
final user = await _getDataUseCase();
|
||||
if (user != null) {
|
||||
emit(TemplateLoaded(user));
|
||||
} else {
|
||||
emit(const TemplateError('No data found'));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(TemplateError(e.toString()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_modular/flutter_modular.dart';
|
||||
import 'package:design_system/design_system.dart'; // Import Design System
|
||||
import '../blocs/template_bloc.dart';
|
||||
|
||||
class TemplatePage extends StatelessWidget {
|
||||
const TemplatePage({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BlocProvider(
|
||||
create: (_) => Modular.get<TemplateBloc>()..add(TemplateStarted()),
|
||||
child: Scaffold(
|
||||
appBar: AppBar(title: const Text('Template Feature')),
|
||||
body: BlocBuilder<TemplateBloc, TemplateState>(
|
||||
builder: (context, state) {
|
||||
if (state is TemplateLoading) {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
} else if (state is TemplateLoaded) {
|
||||
return Center(child: Text('User: ${state.user.email}'));
|
||||
} else if (state is TemplateError) {
|
||||
return Center(child: Text('Error: ${state.message}'));
|
||||
}
|
||||
return const Center(child: Text('Welcome'));
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
library template_feature;
|
||||
|
||||
import 'package:flutter_modular/flutter_modular.dart';
|
||||
import 'src/data/repositories_impl/template_repository_impl.dart';
|
||||
import 'src/domain/repositories/template_repository_interface.dart';
|
||||
import 'src/domain/usecases/get_template_data_usecase.dart';
|
||||
import 'src/presentation/blocs/template_bloc.dart';
|
||||
import 'src/presentation/pages/template_page.dart';
|
||||
|
||||
export 'src/presentation/pages/template_page.dart';
|
||||
|
||||
class TemplateFeatureModule extends Module {
|
||||
@override
|
||||
void binds(Injector i) {
|
||||
// 1. Repositories
|
||||
i.add<TemplateRepositoryInterface>(TemplateRepositoryImpl.new);
|
||||
|
||||
// 2. Use Cases
|
||||
i.add(GetTemplateDataUseCase.new);
|
||||
|
||||
// 3. BLoCs
|
||||
i.add(TemplateBloc.new);
|
||||
}
|
||||
|
||||
@override
|
||||
void routes(r) {
|
||||
r.child('/', child: (_) => const TemplatePage());
|
||||
}
|
||||
}
|
||||
32
apps/packages/features/shared/template_feature/pubspec.yaml
Normal file
32
apps/packages/features/shared/template_feature/pubspec.yaml
Normal file
@@ -0,0 +1,32 @@
|
||||
name: template_feature
|
||||
description: A template feature package following KROW architecture.
|
||||
version: 0.0.1
|
||||
publish_to: none
|
||||
resolution: workspace
|
||||
|
||||
environment:
|
||||
sdk: '>=3.10.0 <4.0.0'
|
||||
flutter: ">=3.0.0"
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
flutter_bloc: ^8.1.0
|
||||
flutter_modular: ^6.3.0
|
||||
equatable: ^2.0.5
|
||||
|
||||
# Core Architecture
|
||||
krow_domain:
|
||||
path: ../../../domain
|
||||
krow_data_connect:
|
||||
path: ../../../data_connect
|
||||
krow_core:
|
||||
path: ../../../core
|
||||
design_system:
|
||||
path: ../../../design_system
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
bloc_test: ^9.1.0
|
||||
mocktail: ^1.0.0
|
||||
Reference in New Issue
Block a user