Add persistent storage

main
Oystein Kristoffer Tveit 2022-02-04 15:13:51 +01:00
parent fef9733ad7
commit d6fb9caa63
6 changed files with 76 additions and 29 deletions

View File

@ -1,3 +1,4 @@
import 'package:get_it/get_it.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:tangocard_reader/router.dart';
import 'package:flutter/material.dart';
@ -6,25 +7,24 @@ import 'service/theme_bloc.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final prefs = await SharedPreferences.getInstance();
runApp(MyApp(prefs: prefs));
GetIt.instance.registerSingleton<SharedPreferences>(
await SharedPreferences.getInstance());
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
final SharedPreferences prefs;
const MyApp({
Key? key,
required this.prefs,
}) : super(key: key);
@override
Widget build(BuildContext context) => BlocProvider(
create: (context) => ThemeBloc(
prefs: prefs,
init: (prefs.getBool('darkTheme') ?? false)
? Brightness.dark
: Brightness.light),
init:
(GetIt.instance.get<SharedPreferences>().getBool('darkTheme') ??
false)
? Brightness.dark
: Brightness.light),
child: BlocBuilder<ThemeBloc, Brightness>(
builder: (context, state) => MaterialApp(
title: 'Tangocard Reader',

View File

@ -76,6 +76,19 @@ class _KanjiPageState extends State<KanjiPage> {
),
const SizedBox(width: 20),
const Divider(thickness: 5),
if (widget.showDrawingPanel) ...[
const SizedBox(width: 20),
Row(
children: [
const Expanded(child: SizedBox()),
IconButton(
iconSize: 40,
onPressed: controller.clear,
icon: const Icon(Icons.delete),
)
],
)
]
],
),
Positioned(

View File

@ -2,6 +2,8 @@ import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get_it/get_it.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:tangocard_reader/models/data_entry.dart';
import 'package:tangocard_reader/screens/practise/kanji.dart';
@ -32,13 +34,22 @@ const encouragingWords = [
class _PractiseViewState extends State<PractiseView> {
late int currentCard;
final List<bool> _flashcardToggles = [false, false];
final List<bool> _kanjiToggles = [false, false];
bool get isShuffleMode => _flashcardToggles[0];
bool get isLanguageSwitchedMode => _flashcardToggles[1];
bool get isKanjiDrawingMode => _kanjiToggles[0];
bool get isKanjiAnimationMode => _kanjiToggles[1];
SharedPreferences get prefs => GetIt.instance.get<SharedPreferences>();
set isShuffleMode(b) => prefs.setBool('shuffleMode', b);
set isLanguageSwitchedMode(b) => prefs.setBool('languageSwitchedMode', b);
set isKanjiDrawingMode(b) => prefs.setBool('kanjiDrawingMode', b);
set isKanjiAnimationMode(b) => prefs.setBool('kanjiAnimationMode', b);
bool get isShuffleMode => prefs.getBool('shuffleMode') ?? false;
bool get isLanguageSwitchedMode =>
prefs.getBool('languageSwitchedMode') ?? false;
bool get isKanjiDrawingMode => prefs.getBool('kanjiDrawingMode') ?? false;
bool get isKanjiAnimationMode => prefs.getBool('kanjiAnimationMode') ?? false;
List<bool> get _flashcardToggles => [isShuffleMode, isLanguageSwitchedMode];
List<bool> get _kanjiToggles => [isKanjiDrawingMode, isKanjiAnimationMode];
int get randomCard => Random().nextInt(widget.entries.length);
String get randomEncouragingWord =>
@ -98,8 +109,15 @@ class _PractiseViewState extends State<PractiseView> {
Icon(Icons.translate),
],
isSelected: _flashcardToggles,
onPressed: (int index) =>
setState(() => _flashcardToggles[index] = !_flashcardToggles[index])),
onPressed: (int index) => setState(
() {
if (index == 0) {
isShuffleMode = !_flashcardToggles[index];
} else if (index == 1) {
isLanguageSwitchedMode = !_flashcardToggles[index];
}
},
)),
],
),
centerTitle: true,
@ -116,14 +134,22 @@ class _PractiseViewState extends State<PractiseView> {
icon: const Icon(Icons.repeat),
),
ToggleButtons(
selectedColor: Colors.white,
children: const [
Icon(Icons.edit),
Icon(Icons.animation),
],
isSelected: _kanjiToggles,
onPressed: (int index) =>
setState(() => _kanjiToggles[index] = !_kanjiToggles[index])),
selectedColor: Colors.white,
children: const [
Icon(Icons.edit),
Icon(Icons.animation),
],
isSelected: _kanjiToggles,
onPressed: (int index) => setState(
() {
if (index == 0) {
isKanjiDrawingMode = !_flashcardToggles[index];
} else if (index == 1) {
isKanjiAnimationMode = !_flashcardToggles[index];
}
},
),
),
],
),
centerTitle: true,

View File

@ -1,5 +1,6 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter/services.dart';
import 'package:get_it/get_it.dart';
import 'package:meta/meta.dart';
import 'package:shared_preferences/shared_preferences.dart';
@ -12,14 +13,13 @@ class SetTheme {
}
class ThemeBloc extends Bloc<SetTheme, Brightness> {
final SharedPreferences prefs;
ThemeBloc({
required this.prefs,
required Brightness init,
}) : super(init) {
on<SetTheme>((event, emit) {
prefs.setBool('darkTheme', event.isDark);
GetIt.instance
.get<SharedPreferences>()
.setBool('darkTheme', event.isDark);
emit(event.isDark ? Brightness.dark : Brightness.light);
});
}

View File

@ -114,6 +114,13 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
get_it:
dependency: "direct main"
description:
name: get_it
url: "https://pub.dartlang.org"
source: hosted
version: "7.2.0"
image:
dependency: transitive
description:

View File

@ -30,6 +30,7 @@ dependencies:
flutter:
sdk: flutter
flutter_bloc: ^8.0.1
get_it: ^7.2.0
shared_preferences: ^2.0.12
signature: ^5.0.0