From b758deab1ac7b1fd9b4473fe2f2648339e5bff15 Mon Sep 17 00:00:00 2001 From: Yan Maniez Date: Thu, 12 Mar 2020 15:57:57 +0100 Subject: [PATCH] BloC --- .../player_character_bloc.dart | 228 ++++++++++++++++++ aidedejeu_flutter/lib/widgets/pceditor.dart | 221 +++++++++++------ aidedejeu_flutter/pubspec.lock | 7 + aidedejeu_flutter/pubspec.yaml | 3 +- 4 files changed, 383 insertions(+), 76 deletions(-) create mode 100644 aidedejeu_flutter/lib/blocs/player_character/player_character_bloc.dart diff --git a/aidedejeu_flutter/lib/blocs/player_character/player_character_bloc.dart b/aidedejeu_flutter/lib/blocs/player_character/player_character_bloc.dart new file mode 100644 index 00000000..a418edd1 --- /dev/null +++ b/aidedejeu_flutter/lib/blocs/player_character/player_character_bloc.dart @@ -0,0 +1,228 @@ +import 'package:aidedejeu_flutter/database.dart'; +import 'package:aidedejeu_flutter/models/items.dart'; +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/cupertino.dart'; + +class PlayerCharacterState { + final BuildContext context; + + PlayerCharacterState({ + this.context, + this.race, + this.races, + this.subRace, + this.subRaces, + this.background, + this.backgrounds, + this.subBackground, + this.subBackgrounds, + }) {} + + PlayerCharacterState copyWith({ + BuildContext context, + RaceItem race, + List races, + SubRaceItem subRace, + List subRaces, + BackgroundItem background, + List backgrounds, + SubBackgroundItem subBackground, + List subBackgrounds, + }) { + return PlayerCharacterState( + context: context ?? this.context, + race: race ?? this.race, + races: races ?? this.races, + subRace: subRace ?? this.subRace, + subRaces: subRaces ?? this.subRaces, + background: background ?? this.background, + backgrounds: backgrounds ?? this.backgrounds, + subBackground: subBackground ?? this.subBackground, + subBackgrounds: subBackgrounds ?? this.subBackgrounds, + ); + } + + RaceItem race; + SubRaceItem subRace; + List races; + List subRaces; + + BackgroundItem background; + SubBackgroundItem subBackground; + List backgrounds; + List subBackgrounds; + + @override + List get props => [ + race, + subRace, + races, + subRaces, + background, + subBackground, + backgrounds, + subBackgrounds + ]; + + Future initRaces() async { + print("initRaces"); + var races = await loadRaces(context); + this.races = races.toList(); + } + + Future initSubRaces(RaceItem race) async { + print("initSubRaces"); + var subRaces = await loadSubRaces(context, race); + this.subRaces = subRaces; + } + + Future initBackgrounds() async { + print("initBackgrounds"); + var backgrounds = await loadBackgrounds(context); + this.backgrounds = backgrounds; + } + + Future initSubBackgrounds(BackgroundItem background) async { + print("initSubBackgrounds"); + var subBackgrounds = await loadSubBackgrounds(context, background); + this.subBackgrounds = subBackgrounds; + } + + // setters + + Future setRace(RaceItem race) async { + this.race = race; + this.subRace = null; + this.subRaces = null; + await initSubRaces(race); + } + + Future setSubRace(SubRaceItem subRace) async { + this.subRace = subRace; + } + + Future setBackground(BackgroundItem background) async { + this.background = background; + this.subBackground = null; + this.subBackgrounds = null; + await initSubBackgrounds(background); + } + + Future setSubBackground(SubBackgroundItem subBackground) async { + this.subBackground = subBackground; + } +} + +abstract class PlayerCharacterEvent extends Equatable {} + +/* +class RacesEvent extends PlayerCharacterEvent { + List races; + + @override + List get props => [races]; +} +*/ +class RaceEvent extends PlayerCharacterEvent { + RaceItem race; + + @override + List get props => [race]; + + RaceEvent(RaceItem race) { + this.race = race; + } +} + +class SubRaceEvent extends PlayerCharacterEvent { + SubRaceItem subRace; + + @override + List get props => [subRace]; + + SubRaceEvent(SubRaceItem subRace) { + this.subRace = subRace; + } +} + +class SetItemEvent extends PlayerCharacterEvent { + T item; + + @override + List get props => [item]; + + SetItemEvent(T item) { + this.item = item; + } +} + +class BackgroundEvent extends SetItemEvent { + BackgroundEvent(BackgroundItem item) : super(item); +} + +class SubBackgroundEvent extends SetItemEvent { + SubBackgroundEvent(SubBackgroundItem item) : super(item); +} + +class LoadEvent extends PlayerCharacterEvent { + @override + List get props => []; +} + +//enum PlayerCharacterEvent { setRace, setSubRace, } +class PlayerCharacterBloc + extends Bloc { + BuildContext context; + + PlayerCharacterBloc(BuildContext context) { + this.context = context; + } + + @override + PlayerCharacterState get initialState => PlayerCharacterState(context: context); + + @override + Stream mapEventToState( + PlayerCharacterEvent event) async* { + if (event is RaceEvent) { + yield* _mapRaceEventToState(event); + } else if (event is SubRaceEvent) { + yield* _mapSubRaceEventToState(event); + } else if (event is BackgroundEvent) { + yield* _mapBackgroundEventToState(event); + } else if (event is SubBackgroundEvent) { + yield* _mapSubBackgroundEventToState(event); + } else if (event is LoadEvent) { + final currentState = state.copyWith(); // state; + await currentState.initRaces(); + await currentState.initBackgrounds(); + yield currentState; + } + + } + Stream _mapRaceEventToState( + RaceEvent event) async* { + final currentState = state.copyWith(); + await currentState.setRace(event.race); + yield currentState; + } + Stream _mapSubRaceEventToState( + SubRaceEvent event) async* { + final currentState = state.copyWith(); + await currentState.setSubRace(event.subRace); + yield currentState; + } + Stream _mapBackgroundEventToState( + BackgroundEvent event) async* { + final currentState = state.copyWith(); + await currentState.setBackground(event.item); + yield currentState; + } + Stream _mapSubBackgroundEventToState( + SubBackgroundEvent event) async* { + final currentState = state.copyWith(); + await currentState.setSubBackground(event.item); + yield currentState; + } +} diff --git a/aidedejeu_flutter/lib/widgets/pceditor.dart b/aidedejeu_flutter/lib/widgets/pceditor.dart index 277418ef..f759d6f7 100644 --- a/aidedejeu_flutter/lib/widgets/pceditor.dart +++ b/aidedejeu_flutter/lib/widgets/pceditor.dart @@ -1,21 +1,24 @@ +import 'package:aidedejeu_flutter/blocs/player_character/player_character_bloc.dart'; import 'package:aidedejeu_flutter/database.dart'; import 'package:aidedejeu_flutter/localization.dart'; import 'package:aidedejeu_flutter/models/items.dart'; import 'package:aidedejeu_flutter/theme.dart'; import 'package:aidedejeu_flutter/widgets/library.dart'; +import 'package:bloc/bloc.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; +import 'package:equatable/equatable.dart'; -class PCEditorPage extends StatefulWidget { - PCEditorPage({Key key}) : super(key: key); +class PCEditorPage extends StatelessWidget { + // StatefulWidget { +/* PCEditorPage({Key key}) : super(key: key); @override State createState() => _PCEditorPageState(); -} - -class _PCEditorPageState extends State { - MarkdownStyleSheet styleSheet; - +}*/ +/* +class PCEditorViewModel { RaceItem _race; SubRaceItem _subRace; List _races; @@ -26,55 +29,45 @@ class _PCEditorPageState extends State { List _backgrounds; List _subBackgrounds; - // inits - - @override - void initState() { - super.initState(); - _initRaces(); - _initBackgrounds(); - } - - @protected - @mustCallSuper - void didChangeDependencies() { - super.didChangeDependencies(); - styleSheet = mainMarkdownStyleSheet(context); + _PCEditorPageState state; + BuildContext context; + PCEditorViewModel(_PCEditorPageState state, BuildContext context) { + this.state = state; + this.context = context; } void _initRaces() async { var races = await loadRaces(context); - setState(() { + state.setState(() { _races = races.toList(); }); } void _initSubRaces(RaceItem race) async { var subRaces = await loadSubRaces(context, race); - setState(() { + state.setState(() { _subRaces = subRaces; }); } void _initBackgrounds() async { var backgrounds = await loadBackgrounds(context); - setState(() { + state.setState(() { _backgrounds = backgrounds; }); } void _initSubBackgrounds(BackgroundItem background) async { var subBackgrounds = await loadSubBackgrounds(context, background); - setState(() { - _subBackgrounds = - subBackgrounds; + state.setState(() { + _subBackgrounds = subBackgrounds; }); } // setters void _setRace(RaceItem race) { - setState(() { + state.setState(() { this._race = race; this._subRace = null; this._subRaces = null; @@ -83,13 +76,13 @@ class _PCEditorPageState extends State { } void _setSubRace(SubRaceItem subRace) { - setState(() { + state.setState(() { this._subRace = subRace; }); } void _setBackground(BackgroundItem background) { - setState(() { + state.setState(() { this._background = background; this._subBackground = null; this._subBackgrounds = null; @@ -98,14 +91,41 @@ class _PCEditorPageState extends State { } void _setSubBackground(SubBackgroundItem subBackground) { - setState(() { + state.setState(() { this._subBackground = subBackground; }); } + +} + + */ + +//class _PCEditorPageState extends State { + MarkdownStyleSheet styleSheet; + + //PCEditorViewModel vm; + // inits +/* + @override + void initState() { + super.initState(); + //vm = PCEditorViewModel(this, context); + //vm._initRaces(); + //vm._initBackgrounds(); + } + + @protected + @mustCallSuper + void didChangeDependencies() { + super.didChangeDependencies(); + styleSheet = mainMarkdownStyleSheet(context); + } +*/ // widgets generics - Widget _buildMarkdown(String markdown) { + Widget _buildMarkdown( + BuildContext context, PlayerCharacterState state, String markdown) { return MarkdownBody( data: markdown ?? "", styleSheet: styleSheet, @@ -116,7 +136,8 @@ class _PCEditorPageState extends State { ); } - Widget _buildSubTitle(String title) { + Widget _buildSubTitle( + BuildContext context, PlayerCharacterState state, String title) { return Text(title, style: TextStyle( fontSize: 16, @@ -125,6 +146,7 @@ class _PCEditorPageState extends State { } Widget _buildItemsWidget( + BuildContext context, PlayerCharacterState state, {String hintText, List items, T selectedItem, @@ -148,80 +170,111 @@ class _PCEditorPageState extends State { // widgets specifics - Widget _buildRacesWidget() { + Widget _buildRacesWidget(BuildContext context, PlayerCharacterState state) { return _buildItemsWidget( + context, + state, hintText: "Race", - items: _races, - selectedItem: _race, + items: state.races, + selectedItem: state.race, onChanged: (value) { - _setRace(value); + //state.setRace(value); + BlocProvider.of(context).add(RaceEvent(value)); }, ); } - Widget _buildSubRacesWidget() { - return _subRaces != null + Widget _buildSubRacesWidget( + BuildContext context, PlayerCharacterState state) { + return state.subRaces != null ? _buildItemsWidget( + context, + state, hintText: "Variante", - items: _subRaces, - selectedItem: _subRace, + items: state.subRaces, + selectedItem: state.subRace, onChanged: (value) { - _setSubRace(value); + //state.setSubRace(value); + BlocProvider.of(context) + .add(SubRaceEvent(value)); }, ) : SizedBox.shrink(); } - Widget _buildRaceDetailsWidget() { - return _race != null + Widget _buildRaceDetailsWidget( + BuildContext context, PlayerCharacterState state) { + return state.race != null ? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - _buildSubTitle(AppLocalizations.of(context).raceAbilityScoreIncrease), - _buildMarkdown(_race?.abilityScoreIncrease), - _buildMarkdown(_subRace?.abilityScoreIncrease), + _buildSubTitle(context, state, + AppLocalizations.of(context).raceAbilityScoreIncrease), + _buildMarkdown(context, state, state.race?.abilityScoreIncrease), + _buildMarkdown( + context, state, state.subRace?.abilityScoreIncrease), Text(""), - _buildSubTitle(AppLocalizations.of(context).raceAge), - _buildMarkdown(_race?.age), + _buildSubTitle( + context, state, AppLocalizations.of(context).raceAge), + _buildMarkdown(context, state, state.race?.age), Text(""), - _buildSubTitle(AppLocalizations.of(context).raceAlignment), - _buildMarkdown(_race?.alignment), + _buildSubTitle( + context, state, AppLocalizations.of(context).raceAlignment), + _buildMarkdown(context, state, state.race?.alignment), Text(""), - _buildSubTitle(AppLocalizations.of(context).raceSize), - _buildMarkdown(_race?.size), + _buildSubTitle( + context, state, AppLocalizations.of(context).raceSize), + _buildMarkdown(context, state, state.race?.size), Text(""), - _buildSubTitle(AppLocalizations.of(context).raceSpeed), - _buildMarkdown(_race?.speed), - _race?.darkvision != null ? Text("") : SizedBox.shrink(), - _race?.darkvision != null ? _buildSubTitle(AppLocalizations.of(context).raceDarkvision) : SizedBox.shrink(), - _race?.darkvision != null ? _buildMarkdown(_race?.darkvision) : SizedBox.shrink(), + _buildSubTitle( + context, state, AppLocalizations.of(context).raceSpeed), + _buildMarkdown(context, state, state.race?.speed), + state.race?.darkvision != null ? Text("") : SizedBox.shrink(), + state.race?.darkvision != null + ? _buildSubTitle(context, state, + AppLocalizations.of(context).raceDarkvision) + : SizedBox.shrink(), + state.race?.darkvision != null + ? _buildMarkdown(context, state, state.race?.darkvision) + : SizedBox.shrink(), Text(""), - _buildSubTitle(AppLocalizations.of(context).raceLanguages), - _buildMarkdown(_race?.languages), + _buildSubTitle( + context, state, AppLocalizations.of(context).raceLanguages), + _buildMarkdown(context, state, state.race?.languages), ], ) : SizedBox.shrink(); } - Widget _buildBackgroundsWidget() { + Widget _buildBackgroundsWidget( + BuildContext context, PlayerCharacterState state) { return _buildItemsWidget( + context, + state, hintText: "Historique", - items: _backgrounds, - selectedItem: _background, + items: state.backgrounds, + selectedItem: state.background, onChanged: (value) { - _setBackground(value); + //state.setBackground(value); + BlocProvider.of(context) + .add(BackgroundEvent(value)); }, ); } - Widget _buildSubBackgroundsWidget() { - return _subBackgrounds != null + Widget _buildSubBackgroundsWidget( + BuildContext context, PlayerCharacterState state) { + return state.subBackgrounds != null ? _buildItemsWidget( + context, + state, hintText: "Variante", - items: _subBackgrounds, - selectedItem: _subBackground, + items: state.subBackgrounds, + selectedItem: state.subBackground, onChanged: (value) { - _setSubBackground(value); + //state.setSubBackground(value); + BlocProvider.of(context) + .add(SubBackgroundEvent(value)); }, ) : SizedBox.shrink(); @@ -229,6 +282,26 @@ class _PCEditorPageState extends State { @override Widget build(BuildContext context) { + return MultiBlocProvider( + providers: [ + BlocProvider( + create: (context) { + return PlayerCharacterBloc(context) + ..add( + LoadEvent(), + ); + }, + ), + ], + child: BlocBuilder( + builder: (context, state) { + return buildUI(context, state); + }, + ), + ); + } + + Widget buildUI(BuildContext context, PlayerCharacterState state) { return DefaultTabController( length: 5, child: Scaffold( @@ -285,9 +358,9 @@ class _PCEditorPageState extends State { margin: EdgeInsets.all(10.0), child: ListView( children: [ - _buildRacesWidget(), - _buildSubRacesWidget(), - _buildRaceDetailsWidget(), + _buildRacesWidget(context, state), + _buildSubRacesWidget(context, state), + _buildRaceDetailsWidget(context, state), ], ), ), @@ -295,8 +368,8 @@ class _PCEditorPageState extends State { margin: EdgeInsets.all(10.0), child: ListView( children: [ - _buildBackgroundsWidget(), - _buildSubBackgroundsWidget(), + _buildBackgroundsWidget(context, state), + _buildSubBackgroundsWidget(context, state), ], ), ), diff --git a/aidedejeu_flutter/pubspec.lock b/aidedejeu_flutter/pubspec.lock index 4927dd75..939ca36b 100644 --- a/aidedejeu_flutter/pubspec.lock +++ b/aidedejeu_flutter/pubspec.lock @@ -99,6 +99,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.3" + equatable: + dependency: "direct main" + description: + name: equatable + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" flutter: dependency: "direct main" description: flutter diff --git a/aidedejeu_flutter/pubspec.yaml b/aidedejeu_flutter/pubspec.yaml index baa5452e..aa8f596a 100644 --- a/aidedejeu_flutter/pubspec.yaml +++ b/aidedejeu_flutter/pubspec.yaml @@ -30,9 +30,8 @@ dependencies: flutter_svg: bloc: flutter_bloc: - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 + equatable: ^1.0.0 dev_dependencies: flutter_test: