refactor: one theme for entire game

pull/11/head
Allison Ryan 4 years ago
parent f0db7c720d
commit ca18de6172

@ -5,9 +5,9 @@ import 'package:pinball_theme/pinball_theme.dart';
part 'theme_state.dart'; part 'theme_state.dart';
class ThemeCubit extends Cubit<ThemeState> { class ThemeCubit extends Cubit<ThemeState> {
ThemeCubit() : super(const ThemeState(DashTheme())); ThemeCubit() : super(const ThemeState.initial());
void themeSelected(PinballTheme theme) { void characterSelected(CharacterTheme characterTheme) {
emit(ThemeState(theme)); emit(ThemeState(PinballTheme(characterTheme: characterTheme)));
} }
} }

@ -3,6 +3,9 @@ part of 'theme_cubit.dart';
class ThemeState extends Equatable { class ThemeState extends Equatable {
const ThemeState(this.theme); const ThemeState(this.theme);
const ThemeState.initial()
: theme = const PinballTheme(characterTheme: DashTheme());
final PinballTheme theme; final PinballTheme theme;
@override @override

@ -1,18 +1,22 @@
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart'; import 'package:pinball_theme/pinball_theme.dart';
/// {@template pinball_theme} /// {@template pinball_theme}
/// Base class for creating pinball themes. /// Defines all theme assets and attributes.
/// ///
/// Character specific game components should have a getter specified here to /// Game components should have a getter specified here to load their
/// load their corresponding assets for the game. /// corresponding assets for the game.
/// {@endtemplate} /// {@endtemplate}
abstract class PinballTheme extends Equatable { class PinballTheme extends Equatable {
/// {@macro pinball_theme} /// {@macro pinball_theme}
const PinballTheme(); const PinballTheme({
required CharacterTheme characterTheme,
}) : _characterTheme = characterTheme;
/// Ball color for this theme. final CharacterTheme _characterTheme;
Color get ballColor;
/// [CharacterTheme] for the chosen character.
CharacterTheme get characterTheme => _characterTheme;
@override @override
List<Object?> get props => []; List<Object?> get props => [];

@ -2,9 +2,9 @@ import 'package:flutter/material.dart';
import 'package:pinball_theme/pinball_theme.dart'; import 'package:pinball_theme/pinball_theme.dart';
/// {@template android_theme} /// {@template android_theme}
/// Defines Android theme assets and attributes. /// Defines Android character theme assets and attributes.
/// {@endtemplate} /// {@endtemplate}
class AndroidTheme extends PinballTheme { class AndroidTheme extends CharacterTheme {
/// {@macro android_theme} /// {@macro android_theme}
const AndroidTheme(); const AndroidTheme();

@ -0,0 +1,19 @@
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
/// {@template character_theme}
/// Base class for creating character themes.
///
/// Character specific game components should have a getter specified here to
/// load their corresponding assets for the game.
/// {@endtemplate}
abstract class CharacterTheme extends Equatable {
/// {@macro character_theme}
const CharacterTheme();
/// Ball color for this theme.
Color get ballColor;
@override
List<Object?> get props => [];
}

@ -2,9 +2,9 @@ import 'package:flutter/material.dart';
import 'package:pinball_theme/pinball_theme.dart'; import 'package:pinball_theme/pinball_theme.dart';
/// {@template dash_theme} /// {@template dash_theme}
/// Defines Dash theme assets and attributes. /// Defines Dash character theme assets and attributes.
/// {@endtemplate} /// {@endtemplate}
class DashTheme extends PinballTheme { class DashTheme extends CharacterTheme {
/// {@macro dash_theme} /// {@macro dash_theme}
const DashTheme(); const DashTheme();

@ -2,9 +2,9 @@ import 'package:flutter/material.dart';
import 'package:pinball_theme/pinball_theme.dart'; import 'package:pinball_theme/pinball_theme.dart';
/// {@template dino_theme} /// {@template dino_theme}
/// Defines Dino theme assets and attributes. /// Defines Dino character theme assets and attributes.
/// {@endtemplate} /// {@endtemplate}
class DinoTheme extends PinballTheme { class DinoTheme extends CharacterTheme {
/// {@macro dino_theme} /// {@macro dino_theme}
const DinoTheme(); const DinoTheme();

@ -2,9 +2,9 @@ import 'package:flutter/material.dart';
import 'package:pinball_theme/pinball_theme.dart'; import 'package:pinball_theme/pinball_theme.dart';
/// {@template sparky_theme} /// {@template sparky_theme}
/// Defines Sparky theme assets and attributes. /// Defines Sparky character theme assets and attributes.
/// {@endtemplate} /// {@endtemplate}
class SparkyTheme extends PinballTheme { class SparkyTheme extends CharacterTheme {
/// {@macro sparky_theme} /// {@macro sparky_theme}
const SparkyTheme(); const SparkyTheme();

@ -1,4 +1,5 @@
export 'android_theme.dart'; export 'android_theme.dart';
export 'character_theme.dart';
export 'dash_theme.dart'; export 'dash_theme.dart';
export 'dino_theme.dart'; export 'dino_theme.dart';
export 'sparky_theme.dart'; export 'sparky_theme.dart';

@ -0,0 +1,28 @@
// ignore_for_file: prefer_const_constructors
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball_theme/pinball_theme.dart';
void main() {
group('PinballTheme', () {
const characterTheme = SparkyTheme();
test('can be instantiated', () {
expect(PinballTheme(characterTheme: characterTheme), isNotNull);
});
test('supports value equality', () {
expect(
PinballTheme(characterTheme: characterTheme),
equals(PinballTheme(characterTheme: characterTheme)),
);
});
test('characterTheme is correct', () {
expect(
PinballTheme(characterTheme: characterTheme).characterTheme,
equals(characterTheme),
);
});
});
}

@ -5,17 +5,17 @@ import 'package:pinball_theme/pinball_theme.dart';
void main() { void main() {
group('ThemeCubit', () { group('ThemeCubit', () {
test('initial state has Dash theme', () { test('initial state has Dash character theme', () {
final themeCubit = ThemeCubit(); final themeCubit = ThemeCubit();
expect(themeCubit.state.theme, equals(const DashTheme())); expect(themeCubit.state.theme.characterTheme, equals(const DashTheme()));
}); });
blocTest<ThemeCubit, ThemeState>( blocTest<ThemeCubit, ThemeState>(
'themeSelected emits selected theme', 'charcterSelected emits selected character theme',
build: ThemeCubit.new, build: ThemeCubit.new,
act: (bloc) => bloc.themeSelected(const SparkyTheme()), act: (bloc) => bloc.characterSelected(const SparkyTheme()),
expect: () => [ expect: () => [
const ThemeState(SparkyTheme()), const ThemeState(PinballTheme(characterTheme: SparkyTheme())),
], ],
); );
}); });

@ -2,18 +2,17 @@
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:pinball/theme/theme.dart'; import 'package:pinball/theme/theme.dart';
import 'package:pinball_theme/pinball_theme.dart';
void main() { void main() {
group('ThemeState', () { group('ThemeState', () {
test('can be instantiated', () { test('can be instantiated', () {
expect(const ThemeState(DashTheme()), isNotNull); expect(const ThemeState.initial(), isNotNull);
}); });
test('supports value equality', () { test('supports value equality', () {
expect( expect(
ThemeState(DashTheme()), ThemeState.initial(),
equals(const ThemeState(DashTheme())), equals(const ThemeState.initial()),
); );
}); });
}); });

Loading…
Cancel
Save