Skip to content

Commit

Permalink
Workaround for the push / pop of pages problem
Browse files Browse the repository at this point in the history
  • Loading branch information
Wolfteam committed Mar 11, 2021
1 parent 1c837f0 commit 15c333c
Show file tree
Hide file tree
Showing 16 changed files with 107 additions and 27 deletions.
2 changes: 1 addition & 1 deletion assets/db/characters.json
Original file line number Diff line number Diff line change
Expand Up @@ -20051,7 +20051,7 @@
"fullImage": "Xiao.png",
"secondFullImage": null,
"isComingSoon": false,
"isNew": true,
"isNew": false,
"isFemale": false,
"region": "liyue",
"role": "mainDps",
Expand Down
13 changes: 10 additions & 3 deletions lib/application/artifact/artifact_bloc.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:genshindb/application/common/pop_bloc.dart';
import 'package:genshindb/domain/app_constants.dart';
import 'package:genshindb/domain/assets.dart';
import 'package:genshindb/domain/models/models.dart';
Expand All @@ -12,12 +12,15 @@ part 'artifact_bloc.freezed.dart';
part 'artifact_event.dart';
part 'artifact_state.dart';

class ArtifactBloc extends Bloc<ArtifactEvent, ArtifactState> {
class ArtifactBloc extends PopBloc<ArtifactEvent, ArtifactState> {
final GenshinService _genshinService;
final TelemetryService _telemetryService;

ArtifactBloc(this._genshinService, this._telemetryService) : super(const ArtifactState.loading());

@override
ArtifactEvent getEventForPop(String key) => ArtifactEvent.loadArtifact(key: key, addToQueue: false);

@override
Stream<ArtifactState> mapEventToState(
ArtifactEvent event,
Expand All @@ -26,14 +29,18 @@ class ArtifactBloc extends Bloc<ArtifactEvent, ArtifactState> {

final s = await event.map(
loadArtifact: (e) async {
await _telemetryService.trackArtifactLoaded(e.key);
final artifact = _genshinService.getArtifact(e.key);
final translation = _genshinService.getArtifactTranslation(e.key);
final charImgs = _genshinService.getCharactersImgUsingArtifact(e.key);

var image = artifact.image.split('.png').first;
image = image.substring(0, image.length - 1);

if (e.addToQueue) {
await _telemetryService.trackArtifactLoaded(e.key);
currentItemsInStack.add(artifact.key);
}

return ArtifactState.loaded(
name: translation.name,
image: artifact.fullImagePath,
Expand Down
1 change: 1 addition & 0 deletions lib/application/artifact/artifact_event.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ part of 'artifact_bloc.dart';
abstract class ArtifactEvent with _$ArtifactEvent {
const factory ArtifactEvent.loadArtifact({
@required String key,
@Default(true) bool addToQueue,
}) = _LoadArtifact;
}
28 changes: 20 additions & 8 deletions lib/application/character/character_bloc.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:genshindb/application/common/pop_bloc.dart';
import 'package:genshindb/domain/assets.dart';
import 'package:genshindb/domain/enums/enums.dart';
import 'package:genshindb/domain/models/models.dart';
Expand All @@ -13,30 +13,42 @@ part 'character_bloc.freezed.dart';
part 'character_event.dart';
part 'character_state.dart';

class CharacterBloc extends Bloc<CharacterEvent, CharacterState> {
class CharacterBloc extends PopBloc<CharacterEvent, CharacterState> {
final GenshinService _genshinService;
final TelemetryService _telemetryService;
final LocaleService _localeService;

CharacterBloc(this._genshinService, this._telemetryService, this._localeService) : super(const CharacterState.loading());

@override
CharacterEvent getEventForPop(String key) => CharacterEvent.loadFromName(key: key, addToQueue: false);

@override
Stream<CharacterState> mapEventToState(
CharacterEvent event,
) async* {
yield const CharacterState.loading();

final s = await event.when(
loadFromName: (name) async {
await _telemetryService.trackCharacterLoaded(name);
final char = _genshinService.getCharacter(name);
final translation = _genshinService.getCharacterTranslation(name);
loadFromName: (key, addToQueue) async {
final char = _genshinService.getCharacter(key);
final translation = _genshinService.getCharacterTranslation(key);

if (addToQueue) {
await _telemetryService.trackCharacterLoaded(key);
currentItemsInStack.add(char.key);
}
return _buildInitialState(char, translation);
},
loadFromImg: (img) async {
await _telemetryService.trackCharacterLoaded(img, loadedFromName: false);
loadFromImg: (img, addToQueue) async {
final char = _genshinService.getCharacterByImg(img);
final translation = _genshinService.getCharacterTranslation(char.key);

if (addToQueue) {
await _telemetryService.trackCharacterLoaded(img, loadedFromName: false);
currentItemsInStack.add(char.key);
}

return _buildInitialState(char, translation);
},
);
Expand Down
2 changes: 2 additions & 0 deletions lib/application/character/character_event.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ part of 'character_bloc.dart';
abstract class CharacterEvent with _$CharacterEvent {
const factory CharacterEvent.loadFromName({
@required String key,
@Default(true) bool addToQueue,
}) = _LoadCharacterFroName;

const factory CharacterEvent.loadFromImg({
@required String image,
@Default(true) bool addToQueue,
}) = _LoadCharacterFromImg;
}
35 changes: 35 additions & 0 deletions lib/application/common/pop_bloc.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import 'package:bloc/bloc.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:genshindb/domain/extensions/string_extensions.dart';

//TODO: USE REPLAY_BLOC ONCE WE MIGRATE TO NULL SAFETY
abstract class PopBloc<Event, State> extends Bloc<Event, State> {
@protected
final List<String> currentItemsInStack = [];

PopBloc(State initialState) : super(initialState);

Event getEventForPop(String key);

void pop() {
final key = _popAndGetLastKey();
if (key.isNotNullEmptyOrWhitespace) {
final event = getEventForPop(key);
add(event);
}
}

String _popAndGetLastKey() {
if (currentItemsInStack.isEmpty) {
return null;
}

currentItemsInStack.removeLast();
if (currentItemsInStack.isEmpty) {
return null;
}

return currentItemsInStack.last;
}
}
23 changes: 17 additions & 6 deletions lib/application/weapon/weapon_bloc.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:genshindb/application/common/pop_bloc.dart';
import 'package:genshindb/domain/enums/enums.dart';
import 'package:genshindb/domain/models/models.dart';
import 'package:genshindb/domain/services/genshin_service.dart';
Expand All @@ -11,28 +11,39 @@ part 'weapon_bloc.freezed.dart';
part 'weapon_event.dart';
part 'weapon_state.dart';

class WeaponBloc extends Bloc<WeaponEvent, WeaponState> {
class WeaponBloc extends PopBloc<WeaponEvent, WeaponState> {
final GenshinService _genshinService;
final TelemetryService _telemetryService;

WeaponBloc(this._genshinService, this._telemetryService) : super(const WeaponState.loading());

@override
WeaponEvent getEventForPop(String key) => WeaponEvent.loadFromName(key: key, addToQueue: false);

@override
Stream<WeaponState> mapEventToState(
WeaponEvent event,
) async* {
yield const WeaponState.loading();
final s = await event.when(
loadFromImg: (img) async {
await _telemetryService.trackWeaponLoaded(img, loadedFromName: false);
loadFromImg: (img, addToQueue) async {
final weapon = _genshinService.getWeaponByImg(img);
final translation = _genshinService.getWeaponTranslation(weapon.key);

if (addToQueue) {
await _telemetryService.trackWeaponLoaded(img, loadedFromName: false);
currentItemsInStack.add(weapon.key);
}
return _buildInitialState(weapon, translation);
},
loadFromName: (name) async {
await _telemetryService.trackWeaponLoaded(name);
loadFromName: (name, addToQueue) async {
final weapon = _genshinService.getWeapon(name);
final translation = _genshinService.getWeaponTranslation(name);

if (addToQueue) {
await _telemetryService.trackWeaponLoaded(name);
currentItemsInStack.add(weapon.key);
}
return _buildInitialState(weapon, translation);
},
);
Expand Down
2 changes: 2 additions & 0 deletions lib/application/weapon/weapon_event.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ part of 'weapon_bloc.dart';
abstract class WeaponEvent with _$WeaponEvent {
const factory WeaponEvent.loadFromName({
@required String key,
@Default(true) bool addToQueue,
}) = _LoadWeaponFromName;

const factory WeaponEvent.loadFromImg({
@required String image,
@Default(true) bool addToQueue,
}) = _LoadWeaponFromImg;
}
2 changes: 1 addition & 1 deletion lib/infrastructure/telemetry/telemetry_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ class TelemetryServiceImpl implements TelemetryService {
}

@override
Future<void> trackTierListOpened() => trackEventAsync('TierList-Opened');
Future<void> trackTierListOpened() => trackEventAsync('TierListBuilder-Opened');

@override
Future<void> trackInit(AppSettings settings) async {
Expand Down
4 changes: 3 additions & 1 deletion lib/presentation/artifacts/widgets/artifact_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,10 @@ class ArtifactCard extends StatelessWidget {
}

Future<void> _gotoDetailPage(BuildContext context) async {
context.read<ArtifactBloc>().add(ArtifactEvent.loadArtifact(key: keyName));
final bloc = context.read<ArtifactBloc>();
bloc.add(ArtifactEvent.loadArtifact(key: keyName));
final route = MaterialPageRoute(builder: (ctx) => ArtifactPage());
await Navigator.of(context).push(route);
bloc.pop();
}
}
4 changes: 3 additions & 1 deletion lib/presentation/characters/widgets/character_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,10 @@ class CharacterCard extends StatelessWidget {
return;
}

context.read<CharacterBloc>().add(CharacterEvent.loadFromName(key: keyName));
final bloc = context.read<CharacterBloc>();
bloc.add(CharacterEvent.loadFromName(key: keyName));
final route = MaterialPageRoute(builder: (c) => const CharacterPage());
await Navigator.push(context, route);
bloc.pop();
}
}
4 changes: 3 additions & 1 deletion lib/presentation/shared/circle_character.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,10 @@ class CircleCharacter extends StatelessWidget {
}

Future<void> _gotoCharacterPage(String image, BuildContext context) async {
context.read<CharacterBloc>().add(CharacterEvent.loadFromImg(image: image));
final bloc = context.read<CharacterBloc>();
bloc.add(CharacterEvent.loadFromImg(image: image));
final route = MaterialPageRoute(builder: (c) => const CharacterPage());
await Navigator.push(context, route);
bloc.pop();
}
}
4 changes: 3 additions & 1 deletion lib/presentation/shared/circle_weapon.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,10 @@ class CircleWeapon extends StatelessWidget {
}

Future<void> _gotoWeaponPage(String image, BuildContext context) async {
context.read<WeaponBloc>().add(WeaponEvent.loadFromImg(image: image));
final bloc = context.read<WeaponBloc>();
bloc.add(WeaponEvent.loadFromImg(image: image));
final route = MaterialPageRoute(builder: (c) => WeaponPage());
await Navigator.push(context, route);
bloc.pop();
}
}
4 changes: 3 additions & 1 deletion lib/presentation/weapons/widgets/weapon_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -168,8 +168,10 @@ class WeaponCard extends StatelessWidget {
return;
}

context.read<WeaponBloc>().add(WeaponEvent.loadFromName(key: keyName));
final bloc = context.read<WeaponBloc>();
bloc.add(WeaponEvent.loadFromName(key: keyName));
final route = MaterialPageRoute(builder: (c) => WeaponPage());
await Navigator.push(context, route);
bloc.pop();
}
}
2 changes: 1 addition & 1 deletion pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -671,7 +671,7 @@ packages:
name: shared_preferences
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
version: "2.0.4"
shared_preferences_linux:
dependency: transitive
description:
Expand Down
4 changes: 2 additions & 2 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.9+48
version: 1.0.9+50

environment:
sdk: ">=2.10.4 <3.0.0"
Expand Down Expand Up @@ -50,7 +50,7 @@ dependencies:
permission_handler: ^5.1.0+2
rate_my_app: ^1.0.0+1
screenshot: ^0.3.0
shared_preferences: ^2.0.3
shared_preferences: ^2.0.4
smooth_star_rating: 1.1.1
sprintf: ^6.0.0
sqlite3_flutter_libs: ^0.4.0+1
Expand Down

0 comments on commit 15c333c

Please sign in to comment.