-
Notifications
You must be signed in to change notification settings - Fork 1
Architektur
Die Standard-Architektur eines Flutter-Projekts lässt sich problemlos erweitern, um komplexere Architektur-Patterns wie MVVM (Model-View-ViewModel), BLoC (Business Logic Component), Redux und andere zu implementieren. Hier sind einige Schritte und Beispiele, wie du diese Architektur anpassen und erweitern kannst:
Erweiterung zu MVVM-Architektur MVVM trennt die Geschäftslogik (Model) und die Benutzeroberfläche (View) durch ein ViewModel, das die Logik und Datenbindung übernimmt.
Verzeichnisstruktur erweitern:
my_project/
├── android/
├── ios/
├── lib/
│ ├── models/
│ │ └── flashcard_model.dart
│ ├── viewmodels/
│ │ └── flashcard_viewmodel.dart
│ ├── views/
│ │ ├── home_view.dart
│ │ ├── login_view.dart
│ │ ├── flashcard_view.dart
│ ├── widgets/
│ │ └── flashcard_widget.dart
│ └── main.dart
├── test/
├── pubspec.yaml
└── README.md
Beispiel für Model, ViewModel und View: flashcard_model.dart (Model):
class Flashcard { final String question; final String answer;
Flashcard({required this.question, required this.answer}); } flashcard_viewmodel.dart (ViewModel):
import 'package:flutter/material.dart'; import '../models/flashcard_model.dart';
class FlashcardViewModel extends ChangeNotifier { List _flashcards = [];
List get flashcards => _flashcards;
void addFlashcard(Flashcard flashcard) { _flashcards.add(flashcard); notifyListeners(); }
void removeFlashcard(Flashcard flashcard) { _flashcards.remove(flashcard); notifyListeners(); } } flashcard_view.dart (View):
import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../viewmodels/flashcard_viewmodel.dart';
class FlashcardView extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text("Flashcards")), body: Consumer( builder: (context, viewModel, child) { return ListView.builder( itemCount: viewModel.flashcards.length, itemBuilder: (context, index) { final flashcard = viewModel.flashcards[index]; return ListTile( title: Text(flashcard.question), subtitle: Text(flashcard.answer), ); }, ); }, ), floatingActionButton: FloatingActionButton( onPressed: () { // Flashcard hinzufügen }, child: Icon(Icons.add), ), ); } } Erweiterung zu BLoC-Architektur BLoC (Business Logic Component) verwendet Streams, um Datenfluss und Zustandsverwaltung zu handhaben.
Verzeichnisstruktur erweitern:
my_project/
├── android/
├── ios/
├── lib/
│ ├── blocs/
│ │ └── flashcard_bloc.dart
│ ├── events/
│ │ └── flashcard_event.dart
│ ├── models/
│ │ └── flashcard_model.dart
│ ├── repositories/
│ │ └── flashcard_repository.dart
│ ├── states/
│ │ └── flashcard_state.dart
│ ├── views/
│ │ ├── home_view.dart
│ │ ├── login_view.dart
│ │ ├── flashcard_view.dart
│ ├── widgets/
│ │ └── flashcard_widget.dart
│ └── main.dart
├── test/
├── pubspec.yaml
└── README.md
Beispiel für BLoC, Event und State: flashcard_event.dart (Event):
abstract class FlashcardEvent {}
class AddFlashcardEvent extends FlashcardEvent { final Flashcard flashcard; AddFlashcardEvent(this.flashcard); }
class RemoveFlashcardEvent extends FlashcardEvent { final Flashcard flashcard; RemoveFlashcardEvent(this.flashcard); } flashcard_state.dart (State):
abstract class FlashcardState {}
class FlashcardInitialState extends FlashcardState {}
class FlashcardLoadedState extends FlashcardState { final List flashcards; FlashcardLoadedState(this.flashcards); } flashcard_bloc.dart (BLoC):
import 'package:flutter_bloc/flutter_bloc.dart'; import '../events/flashcard_event.dart'; import '../states/flashcard_state.dart'; import '../models/flashcard_model.dart';
class FlashcardBloc extends Bloc { List _flashcards = [];
FlashcardBloc() : super(FlashcardInitialState());
@override Stream mapEventToState(FlashcardEvent event) async* { if (event is AddFlashcardEvent) { _flashcards.add(event.flashcard); yield FlashcardLoadedState(_flashcards); } else if (event is RemoveFlashcardEvent) { _flashcards.remove(event.flashcard); yield FlashcardLoadedState(_flashcards); } } } Diese Struktur bietet eine klare Trennung der Verantwortlichkeiten und erleichtert die Erweiterbarkeit und Wartung der App. Mit der Zeit kannst du weitere Patterns und Techniken hinzufügen, um die Architektur noch robuster und anpassungsfähiger zu gestalten.