From d80ebc4d8e56f4f519978787fce86c688d6f0d4e Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Mon, 29 Jun 2020 17:38:57 +0200 Subject: [PATCH 01/59] Update folder structure and add components --- lib/components/kanjiSearch/kanji_list.dart | 13 +++ .../kanjiSearch/kanji_search_card.dart | 15 +++ .../{ => kanjiSearch}/yomi_card.dart | 0 lib/components/kanji_search_card.dart | 0 lib/components/{ => search}/search_card.dart | 0 .../{ => search}/wikipedia_attribute.dart | 0 lib/components/search_bar.dart | 14 +++ pubspec.lock | 97 ++++++------------- 8 files changed, 73 insertions(+), 66 deletions(-) create mode 100644 lib/components/kanjiSearch/kanji_list.dart create mode 100644 lib/components/kanjiSearch/kanji_search_card.dart rename lib/components/{ => kanjiSearch}/yomi_card.dart (100%) delete mode 100644 lib/components/kanji_search_card.dart rename lib/components/{ => search}/search_card.dart (100%) rename lib/components/{ => search}/wikipedia_attribute.dart (100%) create mode 100644 lib/components/search_bar.dart diff --git a/lib/components/kanjiSearch/kanji_list.dart b/lib/components/kanjiSearch/kanji_list.dart new file mode 100644 index 0000000..559c1c9 --- /dev/null +++ b/lib/components/kanjiSearch/kanji_list.dart @@ -0,0 +1,13 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; + +class KanjiGrid extends StatelessWidget { + + @override + Widget build(BuildContext context) { + return GridView.count( + crossAxisCount: 3, + ); + } +} \ No newline at end of file diff --git a/lib/components/kanjiSearch/kanji_search_card.dart b/lib/components/kanjiSearch/kanji_search_card.dart new file mode 100644 index 0000000..08f96fc --- /dev/null +++ b/lib/components/kanjiSearch/kanji_search_card.dart @@ -0,0 +1,15 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; + +class KanjiResultCard extends StatelessWidget { + + @override + Widget build(BuildContext context) { + return Container( + height: 100, + width: 100, + child: Text('Test'), + ); + } +} \ No newline at end of file diff --git a/lib/components/yomi_card.dart b/lib/components/kanjiSearch/yomi_card.dart similarity index 100% rename from lib/components/yomi_card.dart rename to lib/components/kanjiSearch/yomi_card.dart diff --git a/lib/components/kanji_search_card.dart b/lib/components/kanji_search_card.dart deleted file mode 100644 index e69de29..0000000 diff --git a/lib/components/search_card.dart b/lib/components/search/search_card.dart similarity index 100% rename from lib/components/search_card.dart rename to lib/components/search/search_card.dart diff --git a/lib/components/wikipedia_attribute.dart b/lib/components/search/wikipedia_attribute.dart similarity index 100% rename from lib/components/wikipedia_attribute.dart rename to lib/components/search/wikipedia_attribute.dart diff --git a/lib/components/search_bar.dart b/lib/components/search_bar.dart new file mode 100644 index 0000000..751c684 --- /dev/null +++ b/lib/components/search_bar.dart @@ -0,0 +1,14 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; + +class SearchBar extends StatelessWidget { + + @override + Widget build(BuildContext context) { + return Container( + height: 20, + width: 100, + ); + } +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 3b7e3ae..b8d71ba 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,62 +1,48 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.11" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.2" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.4.0" + version: "2.4.1" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "2.0.0" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.1.3" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.11" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.3" + version: "1.14.13" csslib: dependency: transitive description: @@ -71,6 +57,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.3" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -109,20 +102,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.1.4" - image: - dependency: transitive - description: - name: image - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.4" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.6" + version: "0.12.8" meta: dependency: transitive description: @@ -136,7 +122,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.6.4" + version: "1.7.0" pedantic: dependency: transitive description: @@ -144,20 +130,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0+1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "2.4.0" - quiver: - dependency: transitive - description: - name: quiver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" sky_engine: dependency: transitive description: flutter @@ -169,7 +141,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.5.5" + version: "1.7.0" stack_trace: dependency: transitive description: @@ -204,14 +176,14 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.11" + version: "0.2.17" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.1.6" + version: "1.2.0" unofficial_jisho_api: dependency: "direct main" description: @@ -226,12 +198,5 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.8" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "3.5.0" sdks: - dart: ">=2.7.0 <3.0.0" + dart: ">=2.9.0-14.0.dev <3.0.0" From 6d72aa41c33bf8204d405b903764453cbb351bbf Mon Sep 17 00:00:00 2001 From: h7x4 Date: Mon, 29 Jun 2020 23:49:45 +0200 Subject: [PATCH 02/59] Update search field widget --- lib/components/search_bar.dart | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/components/search_bar.dart b/lib/components/search_bar.dart index 751c684..6c2fb33 100644 --- a/lib/components/search_bar.dart +++ b/lib/components/search_bar.dart @@ -6,9 +6,12 @@ class SearchBar extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - height: 20, - width: 100, + return TextField( + controller: TextEditingController(), + decoration: InputDecoration( + labelText: 'Search', + border: OutlineInputBorder() + ), ); } } \ No newline at end of file From 8b094b6e237e2fca1bf0c0f5e52192985e9ce4ff Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Tue, 30 Jun 2020 13:28:07 +0200 Subject: [PATCH 03/59] Update --- lib/components/kanjiSearch/kanji_search_card.dart | 4 ++++ lib/services/jisho_search.dart | 9 +++++++++ pubspec.lock | 2 +- pubspec.yaml | 2 +- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/components/kanjiSearch/kanji_search_card.dart b/lib/components/kanjiSearch/kanji_search_card.dart index 08f96fc..e6b43f5 100644 --- a/lib/components/kanjiSearch/kanji_search_card.dart +++ b/lib/components/kanjiSearch/kanji_search_card.dart @@ -12,4 +12,8 @@ class KanjiResultCard extends StatelessWidget { child: Text('Test'), ); } + + KanjiResultCard(var result) { + + } } \ No newline at end of file diff --git a/lib/services/jisho_search.dart b/lib/services/jisho_search.dart index e69de29..4ff41bb 100644 --- a/lib/services/jisho_search.dart +++ b/lib/services/jisho_search.dart @@ -0,0 +1,9 @@ +import 'package:flutter/material.dart'; +import 'package:unofficial_jisho_api/api.dart'; + +import 'package:jisho_study_tool/components/kanjiSearch/kanji_search_card.dart'; + +Future searchKanji(String kanji) async { + KanjiResult result = await searchForKanji(kanji); + return KanjiResultCard(result); +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index b8d71ba..8873c18 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -190,7 +190,7 @@ packages: name: unofficial_jisho_api url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" + version: "1.1.0" vector_math: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index aa80cfc..d75b381 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 - unofficial_jisho_api: ^1.0.2 + unofficial_jisho_api: ^1.1.0 dev_dependencies: flutter_test: From ac346eb25c885676bb0c69a7e17961c033dba251 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Tue, 30 Jun 2020 15:15:31 +0200 Subject: [PATCH 04/59] Update --- .../kanjiSearch/kanji_search_card.dart | 13 +++++++----- lib/screens/kanji_search.dart | 20 +++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/components/kanjiSearch/kanji_search_card.dart b/lib/components/kanjiSearch/kanji_search_card.dart index e6b43f5..4d5ebe5 100644 --- a/lib/components/kanjiSearch/kanji_search_card.dart +++ b/lib/components/kanjiSearch/kanji_search_card.dart @@ -1,19 +1,22 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; +import 'package:unofficial_jisho_api/api.dart'; + class KanjiResultCard extends StatelessWidget { + KanjiResult _result; + @override Widget build(BuildContext context) { return Container( height: 100, width: 100, - child: Text('Test'), + child: Text(_result.query), ); } - KanjiResultCard(var result) { - + KanjiResultCard(KanjiResult result) { + this._result = result; } + } \ No newline at end of file diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index e69de29..bb0ecd8 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:jisho_study_tool/components/kanjiSearch/kanji_search_card.dart'; +import 'package:jisho_study_tool/services/jisho_search.dart'; + +class KanjiSearch extends StatefulWidget { + + @override + Widget build(BuildContext context) { + return Column( + children: [searchKanji('金')], + ); + } + + @override + State createState() { + // TODO: implement createState + throw UnimplementedError(); + } + +} \ No newline at end of file From f0d8aabe0fbb22bbccb2ebede13c79ad7fbb8b72 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Tue, 30 Jun 2020 16:27:19 +0200 Subject: [PATCH 05/59] Update --- lib/screens/kanji_search.dart | 13 ++----------- lib/services/jisho_search.dart | 12 ++++++++---- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index bb0ecd8..c9d58b2 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -1,20 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:jisho_study_tool/components/kanjiSearch/kanji_search_card.dart'; import 'package:jisho_study_tool/services/jisho_search.dart'; -class KanjiSearch extends StatefulWidget { +class KanjiSearch extends StatelessWidget { @override Widget build(BuildContext context) { - return Column( - children: [searchKanji('金')], - ); - } - - @override - State createState() { - // TODO: implement createState - throw UnimplementedError(); + return searchForKanji('谷'); } } \ No newline at end of file diff --git a/lib/services/jisho_search.dart b/lib/services/jisho_search.dart index 4ff41bb..7cec6e1 100644 --- a/lib/services/jisho_search.dart +++ b/lib/services/jisho_search.dart @@ -1,9 +1,13 @@ import 'package:flutter/material.dart'; -import 'package:unofficial_jisho_api/api.dart'; +import 'package:unofficial_jisho_api/api.dart' as jisho; import 'package:jisho_study_tool/components/kanjiSearch/kanji_search_card.dart'; -Future searchKanji(String kanji) async { - KanjiResult result = await searchForKanji(kanji); - return KanjiResultCard(result); +Widget searchForKanji(String kanji) { + return FutureBuilder( + future: jisho.searchForKanji(kanji), + builder: (BuildContext context, AsyncSnapshot snapshot) { + return KanjiResultCard(snapshot.data); + } + ); } \ No newline at end of file From c90fbc2feea4642a6803cdc0daaf34faca45fdcd Mon Sep 17 00:00:00 2001 From: h7x4 Date: Tue, 30 Jun 2020 22:51:32 +0200 Subject: [PATCH 06/59] Update kanji screen --- lib/components/kanjiSearch/kanji_list.dart | 2 - .../kanjiSearch/kanji_search_card.dart | 3 +- lib/main.dart | 85 +++++++++++++------ lib/services/jisho_search.dart | 8 +- 4 files changed, 68 insertions(+), 30 deletions(-) diff --git a/lib/components/kanjiSearch/kanji_list.dart b/lib/components/kanjiSearch/kanji_list.dart index 559c1c9..b0f49fb 100644 --- a/lib/components/kanjiSearch/kanji_list.dart +++ b/lib/components/kanjiSearch/kanji_list.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; class KanjiGrid extends StatelessWidget { diff --git a/lib/components/kanjiSearch/kanji_search_card.dart b/lib/components/kanjiSearch/kanji_search_card.dart index 4d5ebe5..2b099f1 100644 --- a/lib/components/kanjiSearch/kanji_search_card.dart +++ b/lib/components/kanjiSearch/kanji_search_card.dart @@ -11,7 +11,8 @@ class KanjiResultCard extends StatelessWidget { return Container( height: 100, width: 100, - child: Text(_result.query), + child: Center(child:Text(_result.query)), + color: Colors.amber, ); } diff --git a/lib/main.dart b/lib/main.dart index 2c1c9e8..738277d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:jisho_study_tool/screens/kanji_search.dart'; void main() => runApp(MyApp()); @@ -29,9 +30,10 @@ class _HomeState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text('Jisho Study Tool') + title: Text(pages[_selectedPage].title), + centerTitle: true, ), - body: Container(), + body: pages[_selectedPage].content, bottomNavigationBar: BottomNavigationBar( currentIndex: _selectedPage, onTap: (int index) { @@ -39,29 +41,7 @@ class _HomeState extends State { _selectedPage = index; }); }, - items: [ - BottomNavigationBarItem( - title: Text('Search'), - icon: Icon(Icons.search) - ), - BottomNavigationBarItem( - title: Text('Kanji'), - icon: Text( - '漢', - style: TextStyle( - fontSize: 18 - ), - ) - ), - BottomNavigationBarItem( - title: Text('Memorize'), - icon: Icon(Icons.book) - ), - BottomNavigationBarItem( - title: Text('Settings'), - icon: Icon(Icons.settings) - ), - ], + items: navBar, showSelectedLabels: false, showUnselectedLabels: false, unselectedItemColor: Colors.blue, @@ -70,4 +50,57 @@ class _HomeState extends State { ); } -} \ No newline at end of file +} + +List navBar = [ + BottomNavigationBarItem( + title: Text('Search'), + icon: Icon(Icons.search) + ), + BottomNavigationBarItem( + title: Text('Kanji'), + icon: Text( + '漢', + style: TextStyle( + fontSize: 18 + ), + ) + ), + BottomNavigationBarItem( + title: Text('Memorize'), + icon: Icon(Icons.book) + ), + BottomNavigationBarItem( + title: Text('Settings'), + icon: Icon(Icons.settings) + ), +]; + +class Page { + String title; + Widget content; + + Page({ + this.title, + this.content + }); +} + +List pages = [ + Page( + title: "Search", + content: Container() + ), + Page( + title: "Kanji", + content: KanjiSearch() + ), + Page( + title: "Memorization", + content: Container() + ), + Page( + title: "Settings", + content: Container() + ), +]; \ No newline at end of file diff --git a/lib/services/jisho_search.dart b/lib/services/jisho_search.dart index 7cec6e1..c0c2b1f 100644 --- a/lib/services/jisho_search.dart +++ b/lib/services/jisho_search.dart @@ -7,7 +7,13 @@ Widget searchForKanji(String kanji) { return FutureBuilder( future: jisho.searchForKanji(kanji), builder: (BuildContext context, AsyncSnapshot snapshot) { - return KanjiResultCard(snapshot.data); + if (snapshot.hasData) { + return KanjiResultCard(snapshot.data); + } else if (snapshot.hasError) { + throw 'ASYNC ERROR'; + } else { + return CircularProgressIndicator(); + } } ); } \ No newline at end of file From 0b7dd30505b66509e2159933906538a9b417d382 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 9 Jul 2020 18:14:17 +0200 Subject: [PATCH 07/59] Update --- .../kanjiSearch/kanji_search_card.dart | 41 +++++++++++++------ lib/main.dart | 2 +- lib/screens/kanji_search.dart | 9 ++-- lib/services/jisho_search.dart | 26 ++++++------ 4 files changed, 49 insertions(+), 29 deletions(-) diff --git a/lib/components/kanjiSearch/kanji_search_card.dart b/lib/components/kanjiSearch/kanji_search_card.dart index 2b099f1..ad5ce76 100644 --- a/lib/components/kanjiSearch/kanji_search_card.dart +++ b/lib/components/kanjiSearch/kanji_search_card.dart @@ -3,21 +3,38 @@ import 'package:flutter/material.dart'; import 'package:unofficial_jisho_api/api.dart'; class KanjiResultCard extends StatelessWidget { - - KanjiResult _result; + final KanjiResult _result; @override Widget build(BuildContext context) { - return Container( - height: 100, - width: 100, - child: Center(child:Text(_result.query)), - color: Colors.amber, + return Row( + children: [ + Expanded( + child: Container( + child: Center( + child: Text(_result.query), + ), + height: 50.0, + margin: EdgeInsets.symmetric( + horizontal: 20.0, + vertical: 20.0, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0), + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 2, + blurRadius: 1, + offset: Offset(2, 2), // changes position of shadow + ) + ]), + ), + ), + ], ); } - KanjiResultCard(KanjiResult result) { - this._result = result; - } - -} \ No newline at end of file + KanjiResultCard(this._result); +} diff --git a/lib/main.dart b/lib/main.dart index 738277d..c9f8585 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -68,7 +68,7 @@ List navBar = [ ), BottomNavigationBarItem( title: Text('Memorize'), - icon: Icon(Icons.book) + icon: Icon(Icons.local_offer) ), BottomNavigationBarItem( title: Text('Settings'), diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index c9d58b2..0413db4 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -2,10 +2,11 @@ import 'package:flutter/material.dart'; import 'package:jisho_study_tool/services/jisho_search.dart'; class KanjiSearch extends StatelessWidget { - @override Widget build(BuildContext context) { - return searchForKanji('谷'); + final kanjiCard = searchForKanji('谷'); + return Column( + children: [kanjiCard], + ); } - -} \ No newline at end of file +} diff --git a/lib/services/jisho_search.dart b/lib/services/jisho_search.dart index c0c2b1f..9004266 100644 --- a/lib/services/jisho_search.dart +++ b/lib/services/jisho_search.dart @@ -5,15 +5,17 @@ import 'package:jisho_study_tool/components/kanjiSearch/kanji_search_card.dart'; Widget searchForKanji(String kanji) { return FutureBuilder( - future: jisho.searchForKanji(kanji), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasData) { - return KanjiResultCard(snapshot.data); - } else if (snapshot.hasError) { - throw 'ASYNC ERROR'; - } else { - return CircularProgressIndicator(); - } - } - ); -} \ No newline at end of file + future: jisho.searchForKanji(kanji), + builder: + (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasData) { + return KanjiResultCard(snapshot.data); + } else if (snapshot.hasError) { + throw 'ASYNC ERROR'; + } else { + return Center( + child: CircularProgressIndicator(), + ); + } + }); +} From b8130cb6b92ed94a3ce97d9121010c395caddc15 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 9 Jul 2020 20:06:48 +0200 Subject: [PATCH 08/59] Add Bloc --- lib/bloc/kanji/kanji_bloc.dart | 18 ++++++++ lib/bloc/kanji/kanji_event.dart | 4 ++ lib/bloc/kanji/kanji_state.dart | 14 ++++++ lib/bloc/search/search_bloc.dart | 18 ++++++++ lib/bloc/search/search_event.dart | 4 ++ lib/bloc/search/search_state.dart | 14 ++++++ .../{kanjiSearch => kanji}/kanji_list.dart | 0 .../kanji_search_card.dart | 0 .../{kanjiSearch => kanji}/yomi_card.dart | 0 lib/main.dart | 2 +- lib/services/jisho_search.dart | 2 +- pubspec.lock | 44 +++++++++++++++++-- pubspec.yaml | 3 +- 13 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 lib/bloc/kanji/kanji_bloc.dart create mode 100644 lib/bloc/kanji/kanji_event.dart create mode 100644 lib/bloc/kanji/kanji_state.dart create mode 100644 lib/bloc/search/search_bloc.dart create mode 100644 lib/bloc/search/search_event.dart create mode 100644 lib/bloc/search/search_state.dart rename lib/components/{kanjiSearch => kanji}/kanji_list.dart (100%) rename lib/components/{kanjiSearch => kanji}/kanji_search_card.dart (100%) rename lib/components/{kanjiSearch => kanji}/yomi_card.dart (100%) diff --git a/lib/bloc/kanji/kanji_bloc.dart b/lib/bloc/kanji/kanji_bloc.dart new file mode 100644 index 0000000..40a8030 --- /dev/null +++ b/lib/bloc/kanji/kanji_bloc.dart @@ -0,0 +1,18 @@ +import 'dart:async'; + +import 'package:bloc/bloc.dart'; +import 'package:meta/meta.dart'; + +part 'kanji_event.dart'; +part 'kanji_state.dart'; + +class KanjiBloc extends Bloc { + KanjiBloc() : super(KanjiSearchInitial()); + + @override + Stream mapEventToState( + KanjiEvent event, + ) async* { + // TODO: implement mapEventToState + } +} diff --git a/lib/bloc/kanji/kanji_event.dart b/lib/bloc/kanji/kanji_event.dart new file mode 100644 index 0000000..d2475d0 --- /dev/null +++ b/lib/bloc/kanji/kanji_event.dart @@ -0,0 +1,4 @@ +part of 'kanji_bloc.dart'; + +@immutable +abstract class KanjiEvent {} diff --git a/lib/bloc/kanji/kanji_state.dart b/lib/bloc/kanji/kanji_state.dart new file mode 100644 index 0000000..5013d25 --- /dev/null +++ b/lib/bloc/kanji/kanji_state.dart @@ -0,0 +1,14 @@ +part of 'kanji_bloc.dart'; + +@immutable +abstract class KanjiState {} + +class KanjiSearchInitial extends KanjiState {} + +class KanjiSearchLoading extends KanjiState {} + +class KanjiSearchFinished extends KanjiState {} + +class KanjiSearchError extends KanjiState {} + +class ReKanjiSearch extends KanjiState {} diff --git a/lib/bloc/search/search_bloc.dart b/lib/bloc/search/search_bloc.dart new file mode 100644 index 0000000..1cd2b14 --- /dev/null +++ b/lib/bloc/search/search_bloc.dart @@ -0,0 +1,18 @@ +import 'dart:async'; + +import 'package:bloc/bloc.dart'; +import 'package:meta/meta.dart'; + +part 'search_event.dart'; +part 'search_state.dart'; + +class SearchBloc extends Bloc { + SearchBloc() : super(SearchInitial()); + + @override + Stream mapEventToState( + SearchEvent event, + ) async* { + // TODO: implement mapEventToState + } +} diff --git a/lib/bloc/search/search_event.dart b/lib/bloc/search/search_event.dart new file mode 100644 index 0000000..8d89c5f --- /dev/null +++ b/lib/bloc/search/search_event.dart @@ -0,0 +1,4 @@ +part of 'search_bloc.dart'; + +@immutable +abstract class SearchEvent {} diff --git a/lib/bloc/search/search_state.dart b/lib/bloc/search/search_state.dart new file mode 100644 index 0000000..87f3d6a --- /dev/null +++ b/lib/bloc/search/search_state.dart @@ -0,0 +1,14 @@ +part of 'search_bloc.dart'; + +@immutable +abstract class SearchState {} + +class SearchInitial extends SearchState {} + +class SearchLoading extends SearchState {} + +class SearchFinished extends SearchState {} + +class SearchError extends SearchState {} + +class ReSearch extends SearchState {} \ No newline at end of file diff --git a/lib/components/kanjiSearch/kanji_list.dart b/lib/components/kanji/kanji_list.dart similarity index 100% rename from lib/components/kanjiSearch/kanji_list.dart rename to lib/components/kanji/kanji_list.dart diff --git a/lib/components/kanjiSearch/kanji_search_card.dart b/lib/components/kanji/kanji_search_card.dart similarity index 100% rename from lib/components/kanjiSearch/kanji_search_card.dart rename to lib/components/kanji/kanji_search_card.dart diff --git a/lib/components/kanjiSearch/yomi_card.dart b/lib/components/kanji/yomi_card.dart similarity index 100% rename from lib/components/kanjiSearch/yomi_card.dart rename to lib/components/kanji/yomi_card.dart diff --git a/lib/main.dart b/lib/main.dart index c9f8585..5e15e42 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,7 +8,7 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( - title: 'Flutter Demo', + title: 'Jisho Study Tool', theme: ThemeData( primarySwatch: Colors.blue, ), diff --git a/lib/services/jisho_search.dart b/lib/services/jisho_search.dart index 9004266..95044f9 100644 --- a/lib/services/jisho_search.dart +++ b/lib/services/jisho_search.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:unofficial_jisho_api/api.dart' as jisho; -import 'package:jisho_study_tool/components/kanjiSearch/kanji_search_card.dart'; +import 'package:jisho_study_tool/components/kanji/kanji_search_card.dart'; Widget searchForKanji(String kanji) { return FutureBuilder( diff --git a/pubspec.lock b/pubspec.lock index 8873c18..b904e8c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -8,6 +8,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.4.1" + bloc: + dependency: transitive + description: + name: bloc + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.1" boolean_selector: dependency: transitive description: @@ -50,13 +57,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.16.1" - cupertino_icons: - dependency: "direct main" + cubit: + dependency: transitive description: - name: cupertino_icons + name: cubit url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.2" fake_async: dependency: transitive description: @@ -69,6 +76,20 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_bloc: + dependency: "direct main" + description: + name: flutter_bloc + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.1" + flutter_cubit: + dependency: transitive + description: + name: flutter_cubit + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.1" flutter_test: dependency: "direct dev" description: flutter @@ -116,6 +137,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.8" + nested: + dependency: transitive + description: + name: nested + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.4" path: dependency: transitive description: @@ -130,6 +158,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0+1" + provider: + dependency: transitive + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "4.3.0" sky_engine: dependency: transitive description: flutter @@ -200,3 +235,4 @@ packages: version: "2.0.8" sdks: dart: ">=2.9.0-14.0.dev <3.0.0" + flutter: ">=1.16.0" diff --git a/pubspec.yaml b/pubspec.yaml index d75b381..26113cb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -22,8 +22,9 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^0.1.2 + # cupertino_icons: ^0.1.2 unofficial_jisho_api: ^1.1.0 + flutter_bloc: ^5.0.1 dev_dependencies: flutter_test: From 8dab9e5cb989d7a2a96bb7c7ce441d1539c331dc Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 9 Jul 2020 20:59:00 +0200 Subject: [PATCH 09/59] Add log page --- lib/main.dart | 81 ++++++++++++++++++++++---------------------- lib/screens/log.dart | 0 2 files changed, 41 insertions(+), 40 deletions(-) create mode 100644 lib/screens/log.dart diff --git a/lib/main.dart b/lib/main.dart index 5e15e42..96d3a2a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -20,59 +20,59 @@ class MyApp extends StatelessWidget { class Home extends StatefulWidget { @override _HomeState createState() => _HomeState(); - } class _HomeState extends State { int _selectedPage = 0; @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(pages[_selectedPage].title), - centerTitle: true, - ), - body: pages[_selectedPage].content, - bottomNavigationBar: BottomNavigationBar( - currentIndex: _selectedPage, - onTap: (int index) { - setState(() { - _selectedPage = index; - }); - }, - items: navBar, - showSelectedLabels: false, - showUnselectedLabels: false, - unselectedItemColor: Colors.blue, - selectedItemColor: Colors.green, - ), - ); - } - + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(pages[_selectedPage].title), + centerTitle: true, + ), + body: pages[_selectedPage].content, + bottomNavigationBar: BottomNavigationBar( + currentIndex: _selectedPage, + onTap: (int index) { + setState(() { + _selectedPage = index; + }); + }, + items: navBar, + showSelectedLabels: false, + showUnselectedLabels: false, + unselectedItemColor: Colors.blue, + selectedItemColor: Colors.green, + ), + ); + } } List navBar = [ BottomNavigationBarItem( title: Text('Search'), - icon: Icon(Icons.search) + icon: Icon(Icons.search), ), BottomNavigationBarItem( title: Text('Kanji'), icon: Text( '漢', - style: TextStyle( - fontSize: 18 - ), - ) + style: TextStyle(fontSize: 18), + ), + ), + BottomNavigationBarItem( + title: Text('Log'), + icon: Icon(Icons.bookmark), ), BottomNavigationBarItem( title: Text('Memorize'), - icon: Icon(Icons.local_offer) + icon: Icon(Icons.local_offer), ), BottomNavigationBarItem( title: Text('Settings'), - icon: Icon(Icons.settings) + icon: Icon(Icons.settings), ), ]; @@ -80,27 +80,28 @@ class Page { String title; Widget content; - Page({ - this.title, - this.content - }); + Page({this.title, this.content}); } List pages = [ Page( title: "Search", - content: Container() + content: Container(), ), Page( title: "Kanji", - content: KanjiSearch() + content: KanjiSearch(), + ), + Page( + title: "Log", + content: Container(), ), Page( title: "Memorization", - content: Container() + content: Container(), ), Page( title: "Settings", - content: Container() + content: Container(), ), -]; \ No newline at end of file +]; diff --git a/lib/screens/log.dart b/lib/screens/log.dart new file mode 100644 index 0000000..e69de29 From 1f0b3c24c277ed9a3392b398415f65b2104c41a6 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 9 Jul 2020 22:17:10 +0200 Subject: [PATCH 10/59] Update --- lib/components/kanji/kanji_search_card.dart | 40 ------------- lib/components/kanji/kanji_search_page.dart | 43 ++++++++++++++ lib/components/search/search_card.dart | 41 ++++++++++++++ lib/components/search_bar.dart | 14 +++-- lib/main.dart | 8 ++- lib/screens/kanji_search.dart | 7 +-- lib/screens/log.dart | 10 ++++ lib/screens/search.dart | 14 +++++ lib/services/jisho_search.dart | 2 +- pubspec.lock | 63 ++++++++++++++++++++- pubspec.yaml | 1 + 11 files changed, 188 insertions(+), 55 deletions(-) delete mode 100644 lib/components/kanji/kanji_search_card.dart create mode 100644 lib/components/kanji/kanji_search_page.dart diff --git a/lib/components/kanji/kanji_search_card.dart b/lib/components/kanji/kanji_search_card.dart deleted file mode 100644 index ad5ce76..0000000 --- a/lib/components/kanji/kanji_search_card.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:unofficial_jisho_api/api.dart'; - -class KanjiResultCard extends StatelessWidget { - final KanjiResult _result; - - @override - Widget build(BuildContext context) { - return Row( - children: [ - Expanded( - child: Container( - child: Center( - child: Text(_result.query), - ), - height: 50.0, - margin: EdgeInsets.symmetric( - horizontal: 20.0, - vertical: 20.0, - ), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.0), - color: Colors.white, - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 1, - offset: Offset(2, 2), // changes position of shadow - ) - ]), - ), - ), - ], - ); - } - - KanjiResultCard(this._result); -} diff --git a/lib/components/kanji/kanji_search_page.dart b/lib/components/kanji/kanji_search_page.dart new file mode 100644 index 0000000..e99b0a5 --- /dev/null +++ b/lib/components/kanji/kanji_search_page.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; + +import 'package:unofficial_jisho_api/api.dart'; + +class _Header extends StatelessWidget { + final String _kanji; + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric(vertical: 20.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0), color: Colors.blue), + child: Padding( + padding: const EdgeInsets.all(10.0), + child: Text( + _kanji, + style: TextStyle(fontSize: 70.0, color: Colors.white), + ), + ), + ); + } + + _Header(this._kanji); +} + +class KanjiResultCard extends StatelessWidget { + final KanjiResult _result; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [_Header(_result.query)], + ), + ], + ); + } + + KanjiResultCard(this._result); +} diff --git a/lib/components/search/search_card.dart b/lib/components/search/search_card.dart index e69de29..383efc8 100644 --- a/lib/components/search/search_card.dart +++ b/lib/components/search/search_card.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +import 'package:unofficial_jisho_api/api.dart'; + +class SearchResultCard extends StatelessWidget { + final JishoResult _result; + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: Container( + child: Center( + child: Text(_result.toJson().toString()), + ), + height: 50.0, + margin: EdgeInsets.symmetric( + horizontal: 20.0, + vertical: 20.0, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0), + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 2, + blurRadius: 1, + offset: Offset(2, 2), // changes position of shadow + ) + ]), + ), + ), + ], + ); + } + + SearchResultCard(this._result); +} + diff --git a/lib/components/search_bar.dart b/lib/components/search_bar.dart index 6c2fb33..f7e916c 100644 --- a/lib/components/search_bar.dart +++ b/lib/components/search_bar.dart @@ -6,11 +6,15 @@ class SearchBar extends StatelessWidget { @override Widget build(BuildContext context) { - return TextField( - controller: TextEditingController(), - decoration: InputDecoration( - labelText: 'Search', - border: OutlineInputBorder() + return Container( + padding: EdgeInsets.symmetric(horizontal: 20.0), + child: TextField( + controller: TextEditingController(), + decoration: InputDecoration( + labelText: 'Search', + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10.0) + ), ), ); } diff --git a/lib/main.dart b/lib/main.dart index 96d3a2a..479d717 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:jisho_study_tool/screens/kanji_search.dart'; +import 'package:jisho_study_tool/screens/log.dart'; +import 'package:jisho_study_tool/screens/search.dart'; void main() => runApp(MyApp()); @@ -86,15 +88,15 @@ class Page { List pages = [ Page( title: "Search", - content: Container(), + content: SearchView(), ), Page( title: "Kanji", - content: KanjiSearch(), + content: KanjiView(), ), Page( title: "Log", - content: Container(), + content: LogView(), ), Page( title: "Memorization", diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index 0413db4..5963b7f 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -1,12 +1,9 @@ import 'package:flutter/material.dart'; import 'package:jisho_study_tool/services/jisho_search.dart'; -class KanjiSearch extends StatelessWidget { +class KanjiView extends StatelessWidget { @override Widget build(BuildContext context) { - final kanjiCard = searchForKanji('谷'); - return Column( - children: [kanjiCard], - ); + return searchForKanji('谷'); } } diff --git a/lib/screens/log.dart b/lib/screens/log.dart index e69de29..2718588 100644 --- a/lib/screens/log.dart +++ b/lib/screens/log.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class LogView extends StatelessWidget { + @override + Widget build(BuildContext context) { + return ListView.builder( + itemBuilder: (context, index) => ListTile(), + ); + } +} diff --git a/lib/screens/search.dart b/lib/screens/search.dart index e69de29..fbf9b9f 100644 --- a/lib/screens/search.dart +++ b/lib/screens/search.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:jisho_study_tool/components/search_bar.dart'; + +class SearchView extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SearchBar(), + ], + ); + } +} \ No newline at end of file diff --git a/lib/services/jisho_search.dart b/lib/services/jisho_search.dart index 95044f9..055c546 100644 --- a/lib/services/jisho_search.dart +++ b/lib/services/jisho_search.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:unofficial_jisho_api/api.dart' as jisho; -import 'package:jisho_study_tool/components/kanji/kanji_search_card.dart'; +import 'package:jisho_study_tool/components/kanji/kanji_search_page.dart'; Widget searchForKanji(String kanji) { return FutureBuilder( diff --git a/pubspec.lock b/pubspec.lock index b904e8c..5f2e93d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -95,6 +95,11 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" html: dependency: transitive description: @@ -158,6 +163,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0+1" + platform_detect: + dependency: transitive + description: + name: platform_detect + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" provider: dependency: transitive description: @@ -165,6 +184,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.3.0" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.4" sky_engine: dependency: transitive description: flutter @@ -226,6 +252,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "5.5.0" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+7" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.7" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.2" vector_math: dependency: transitive description: @@ -235,4 +296,4 @@ packages: version: "2.0.8" sdks: dart: ">=2.9.0-14.0.dev <3.0.0" - flutter: ">=1.16.0" + flutter: ">=1.16.0 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 26113cb..7b108ef 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,6 +25,7 @@ dependencies: # cupertino_icons: ^0.1.2 unofficial_jisho_api: ^1.1.0 flutter_bloc: ^5.0.1 + url_launcher: ^5.5.0 dev_dependencies: flutter_test: From f214976893aef2cd4da4ed1a4aaf3d45c19d847b Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 9 Jul 2020 22:58:30 +0200 Subject: [PATCH 11/59] Update --- lib/components/kanji/kanji_search_page.dart | 52 +++++++++++++++++++++ lib/components/search_bar.dart | 23 +++++---- 2 files changed, 63 insertions(+), 12 deletions(-) diff --git a/lib/components/kanji/kanji_search_page.dart b/lib/components/kanji/kanji_search_page.dart index e99b0a5..09f0a4d 100644 --- a/lib/components/kanji/kanji_search_page.dart +++ b/lib/components/kanji/kanji_search_page.dart @@ -24,6 +24,54 @@ class _Header extends StatelessWidget { _Header(this._kanji); } +class _JlptLevel extends StatelessWidget { + final String _jlptLevel; + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(10.0), + child: Text( + _jlptLevel, + style: TextStyle( + color: Colors.white, + fontSize: 20.0, + ), + ), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.blue, + ), + ); + } + + _JlptLevel(this._jlptLevel); +} + +class _Grade extends StatelessWidget { + final String _grade; + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(10.0), + child: Text( + _grade, + style: TextStyle( + color: Colors.white, + fontSize: 20.0, + ), + ), + decoration: BoxDecoration( + color: Colors.blue, + borderRadius: BorderRadius.circular(10.0), + ), + ); + } + + _Grade(this._grade); +} + class KanjiResultCard extends StatelessWidget { final KanjiResult _result; @@ -35,6 +83,10 @@ class KanjiResultCard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [_Header(_result.query)], ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [_JlptLevel(_result.jlptLevel), _Grade(_result.taughtIn)], + ) ], ); } diff --git a/lib/components/search_bar.dart b/lib/components/search_bar.dart index f7e916c..11fcf6b 100644 --- a/lib/components/search_bar.dart +++ b/lib/components/search_bar.dart @@ -3,19 +3,18 @@ import 'dart:io'; import 'package:flutter/material.dart'; class SearchBar extends StatelessWidget { - @override Widget build(BuildContext context) { return Container( - padding: EdgeInsets.symmetric(horizontal: 20.0), - child: TextField( - controller: TextEditingController(), - decoration: InputDecoration( - labelText: 'Search', - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0) - ), - ), - ); + padding: EdgeInsets.symmetric(horizontal: 20.0), + child: TextField( + controller: TextEditingController(), + decoration: InputDecoration( + labelText: 'Search', + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10.0), + ), + ), + )); } -} \ No newline at end of file +} From c5e32475165d368e4c264213f38eb198d59bf8a2 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 9 Jul 2020 23:09:31 +0200 Subject: [PATCH 12/59] Add Stroke Order Gif to kanji --- lib/components/kanji/kanji_search_page.dart | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/components/kanji/kanji_search_page.dart b/lib/components/kanji/kanji_search_page.dart index 09f0a4d..76bc122 100644 --- a/lib/components/kanji/kanji_search_page.dart +++ b/lib/components/kanji/kanji_search_page.dart @@ -86,6 +86,20 @@ class KanjiResultCard extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [_JlptLevel(_result.jlptLevel), _Grade(_result.taughtIn)], + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + margin: EdgeInsets.symmetric(vertical: 20.0), + padding: EdgeInsets.all(10.0), + child: Image.network(_result.strokeOrderGifUri), + decoration: BoxDecoration( + color: Colors.blue, + borderRadius: BorderRadius.circular(10.0), + ), + ) + ], ) ], ); From f61477fd69940c5f646d7156520064ccbbe1f0d6 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 9 Jul 2020 23:45:31 +0200 Subject: [PATCH 13/59] Update --- lib/components/kanji/kanji_search_page.dart | 32 ++++++++----- lib/components/search_bar.dart | 52 +++++++++++++++++---- 2 files changed, 65 insertions(+), 19 deletions(-) diff --git a/lib/components/kanji/kanji_search_page.dart b/lib/components/kanji/kanji_search_page.dart index 76bc122..7348db4 100644 --- a/lib/components/kanji/kanji_search_page.dart +++ b/lib/components/kanji/kanji_search_page.dart @@ -72,6 +72,26 @@ class _Grade extends StatelessWidget { _Grade(this._grade); } +class _StrokeOrderGif extends StatelessWidget { + final String _uri; + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric(vertical: 20.0), + padding: EdgeInsets.all(5.0), + child: ClipRRect(child: Image.network(_uri), + borderRadius: BorderRadius.circular(10.0),), + decoration: BoxDecoration( + color: Colors.blue, + borderRadius: BorderRadius.circular(15.0), + ), + ); + } + + _StrokeOrderGif(this._uri); +} + class KanjiResultCard extends StatelessWidget { final KanjiResult _result; @@ -89,17 +109,7 @@ class KanjiResultCard extends StatelessWidget { ), Row( mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - margin: EdgeInsets.symmetric(vertical: 20.0), - padding: EdgeInsets.all(10.0), - child: Image.network(_result.strokeOrderGifUri), - decoration: BoxDecoration( - color: Colors.blue, - borderRadius: BorderRadius.circular(10.0), - ), - ) - ], + children: [_StrokeOrderGif(_result.strokeOrderGifUri)], ) ], ); diff --git a/lib/components/search_bar.dart b/lib/components/search_bar.dart index 11fcf6b..fefdc3e 100644 --- a/lib/components/search_bar.dart +++ b/lib/components/search_bar.dart @@ -2,19 +2,55 @@ import 'dart:io'; import 'package:flutter/material.dart'; +class _LanguageOption extends StatelessWidget { + final String _language; + + @override + Widget build(BuildContext context) { + return Expanded( + child: Container( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: Center(child: Text(_language)), + decoration: BoxDecoration( + border: Border.all( + color: Colors.black, + width: 1.0, + ), + ), + ), + ); + } + + _LanguageOption(this._language); +} + class SearchBar extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: EdgeInsets.symmetric(horizontal: 20.0), - child: TextField( - controller: TextEditingController(), - decoration: InputDecoration( - labelText: 'Search', - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0), + padding: EdgeInsets.symmetric(horizontal: 20.0), + child: Column( + children: [ + TextField( + controller: TextEditingController(), + decoration: InputDecoration( + labelText: 'Search', + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10.0), + ), ), ), - )); + SizedBox( + height: 10.0, + ), + Row( + children: [ + _LanguageOption('English'), + _LanguageOption('Japanese'), + ], + ), + ], + ), + ); } } From 709b43d95dc4e28dd7028d1f2ae9aacd60059591 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Fri, 10 Jul 2020 13:28:31 +0200 Subject: [PATCH 14/59] Update Kanji Layout --- lib/components/kanji/kanji_search_page.dart | 124 +++++++++++++++++--- lib/screens/kanji_search.dart | 2 +- lib/services/kanji_search.dart | 0 3 files changed, 111 insertions(+), 15 deletions(-) create mode 100644 lib/services/kanji_search.dart diff --git a/lib/components/kanji/kanji_search_page.dart b/lib/components/kanji/kanji_search_page.dart index 7348db4..638a4d0 100644 --- a/lib/components/kanji/kanji_search_page.dart +++ b/lib/components/kanji/kanji_search_page.dart @@ -8,14 +8,13 @@ class _Header extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - margin: EdgeInsets.symmetric(vertical: 20.0), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10.0), color: Colors.blue), child: Padding( padding: const EdgeInsets.all(10.0), child: Text( _kanji, - style: TextStyle(fontSize: 70.0, color: Colors.white), + style: TextStyle(fontSize: 80.0, color: Colors.white), ), ), ); @@ -48,6 +47,30 @@ class _JlptLevel extends StatelessWidget { _JlptLevel(this._jlptLevel); } +class _Rank extends StatelessWidget { + final int _rank; + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(10.0), + child: Text( + '${_rank.toString()} / 2500', + style: TextStyle( + color: Colors.white, + fontSize: 20.0, + ), + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0), + color: Colors.blue, + ), + ); + } + + _Rank(this._rank); +} + class _Grade extends StatelessWidget { final String _grade; @@ -72,6 +95,30 @@ class _Grade extends StatelessWidget { _Grade(this._grade); } +class _Radical extends StatelessWidget { + final Radical _radical; + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(10.0), + child: Text( + _radical.symbol, + style: TextStyle( + color: Colors.white, + fontSize: 20.0, + ), + ), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.blue, + ), + ); + } + + _Radical(this._radical); +} + class _StrokeOrderGif extends StatelessWidget { final String _uri; @@ -80,8 +127,10 @@ class _StrokeOrderGif extends StatelessWidget { return Container( margin: EdgeInsets.symmetric(vertical: 20.0), padding: EdgeInsets.all(5.0), - child: ClipRRect(child: Image.network(_uri), - borderRadius: BorderRadius.circular(10.0),), + child: ClipRRect( + child: Image.network(_uri), + borderRadius: BorderRadius.circular(10.0), + ), decoration: BoxDecoration( color: Colors.blue, borderRadius: BorderRadius.circular(15.0), @@ -99,18 +148,65 @@ class KanjiResultCard extends StatelessWidget { Widget build(BuildContext context) { return Column( children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [_Header(_result.query)], + Container( + margin: EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 30.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Flexible( + flex: 1, + fit: FlexFit.tight, + child: Center(child: SizedBox()), + ), + Flexible( + flex: 1, + fit: FlexFit.tight, + child: Center(child: _Header(_result.query)), + ), + Flexible( + flex: 1, + fit: FlexFit.tight, + child: Center( + child: _Radical(_result.radical), + ), + ), + ], + ), ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [_JlptLevel(_result.jlptLevel), _Grade(_result.taughtIn)], + IntrinsicHeight( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _StrokeOrderGif(_result.strokeOrderGifUri), + Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text("JLPT: ", style: TextStyle(fontSize: 20.0)), + _JlptLevel(_result.jlptLevel), + ], + ), + Row( + children: [ + Text("Grade: ", style: TextStyle(fontSize: 20.0)), + _Grade(_result.taughtIn), + ], + ), + Row( + children: [ + Text("Rank: ", style: TextStyle(fontSize: 20.0)), + _Rank(_result.newspaperFrequencyRank), + ], + ), + ], + ), + ), + ], + ), ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [_StrokeOrderGif(_result.strokeOrderGifUri)], - ) ], ); } diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index 5963b7f..eaeb72a 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -4,6 +4,6 @@ import 'package:jisho_study_tool/services/jisho_search.dart'; class KanjiView extends StatelessWidget { @override Widget build(BuildContext context) { - return searchForKanji('谷'); + return searchForKanji('拒'); } } diff --git a/lib/services/kanji_search.dart b/lib/services/kanji_search.dart new file mode 100644 index 0000000..e69de29 From e0df9893590a4c23c9dce26bfc19cebec879ba07 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Fri, 10 Jul 2020 15:53:51 +0200 Subject: [PATCH 15/59] Redirect kanji function --- lib/components/kanji/kanji_search_page.dart | 58 ++++++++++----------- lib/screens/kanji_search.dart | 2 +- lib/services/jisho_search.dart | 27 +++++----- lib/services/kanji_search.dart | 23 ++++++++ 4 files changed, 67 insertions(+), 43 deletions(-) diff --git a/lib/components/kanji/kanji_search_page.dart b/lib/components/kanji/kanji_search_page.dart index 638a4d0..a5820ae 100644 --- a/lib/components/kanji/kanji_search_page.dart +++ b/lib/components/kanji/kanji_search_page.dart @@ -23,30 +23,6 @@ class _Header extends StatelessWidget { _Header(this._kanji); } -class _JlptLevel extends StatelessWidget { - final String _jlptLevel; - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.all(10.0), - child: Text( - _jlptLevel, - style: TextStyle( - color: Colors.white, - fontSize: 20.0, - ), - ), - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.blue, - ), - ); - } - - _JlptLevel(this._jlptLevel); -} - class _Rank extends StatelessWidget { final int _rank; @@ -71,6 +47,30 @@ class _Rank extends StatelessWidget { _Rank(this._rank); } +class _JlptLevel extends StatelessWidget { + final String _jlptLevel; + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(10.0), + child: Text( + _jlptLevel, + style: TextStyle( + color: Colors.white, + fontSize: 20.0, + ), + ), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.blue, + ), + ); + } + + _JlptLevel(this._jlptLevel); +} + class _Grade extends StatelessWidget { final String _grade; @@ -87,7 +87,7 @@ class _Grade extends StatelessWidget { ), decoration: BoxDecoration( color: Colors.blue, - borderRadius: BorderRadius.circular(10.0), + shape: BoxShape.circle, ), ); } @@ -106,7 +106,7 @@ class _Radical extends StatelessWidget { _radical.symbol, style: TextStyle( color: Colors.white, - fontSize: 20.0, + fontSize: 40.0, ), ), decoration: BoxDecoration( @@ -186,19 +186,19 @@ class KanjiResultCard extends StatelessWidget { Row( children: [ Text("JLPT: ", style: TextStyle(fontSize: 20.0)), - _JlptLevel(_result.jlptLevel), + _JlptLevel(_result.jlptLevel ?? "⨉"), ], ), Row( children: [ Text("Grade: ", style: TextStyle(fontSize: 20.0)), - _Grade(_result.taughtIn), + _Grade(_result.taughtIn ?? "⨉"), ], ), Row( children: [ Text("Rank: ", style: TextStyle(fontSize: 20.0)), - _Rank(_result.newspaperFrequencyRank), + _Rank(_result.newspaperFrequencyRank ?? -1), ], ), ], diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index eaeb72a..b532237 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -4,6 +4,6 @@ import 'package:jisho_study_tool/services/jisho_search.dart'; class KanjiView extends StatelessWidget { @override Widget build(BuildContext context) { - return searchForKanji('拒'); + return searchForKanji('黽'); } } diff --git a/lib/services/jisho_search.dart b/lib/services/jisho_search.dart index 055c546..e10dcab 100644 --- a/lib/services/jisho_search.dart +++ b/lib/services/jisho_search.dart @@ -1,21 +1,22 @@ import 'package:flutter/material.dart'; +import './kanji_search.dart'; import 'package:unofficial_jisho_api/api.dart' as jisho; import 'package:jisho_study_tool/components/kanji/kanji_search_page.dart'; Widget searchForKanji(String kanji) { return FutureBuilder( - future: jisho.searchForKanji(kanji), - builder: - (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasData) { - return KanjiResultCard(snapshot.data); - } else if (snapshot.hasError) { - throw 'ASYNC ERROR'; - } else { - return Center( - child: CircularProgressIndicator(), - ); - } - }); + future: fetchKanji(kanji), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasData) { + return KanjiResultCard(snapshot.data); + } else if (snapshot.hasError) { + throw 'ASYNC ERROR'; + } else { + return Center( + child: CircularProgressIndicator(), + ); + } + }, + ); } diff --git a/lib/services/kanji_search.dart b/lib/services/kanji_search.dart index e69de29..ff4b460 100644 --- a/lib/services/kanji_search.dart +++ b/lib/services/kanji_search.dart @@ -0,0 +1,23 @@ +import 'package:unofficial_jisho_api/api.dart' as jisho; + +String _convertGrade(String grade) { + const _conversionTable = { + "grade 1": "小1", + "grade 2": "小2", + "grade 3": "小3", + "grade 4": "小4", + "grade 5": "小5", + "grade 6": "小6", + "junior high": "中" + }; + + print('conversion run: $grade -> ${_conversionTable[grade]}'); + + return _conversionTable[grade]; +} + +Future fetchKanji(String kanji) async { + final result = await jisho.searchForKanji(kanji); + result.taughtIn = _convertGrade(result.taughtIn); + return result; +} \ No newline at end of file From bfd689162b9fbe68d239b9b8e2edd8ee85015072 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Fri, 10 Jul 2020 23:50:19 +0200 Subject: [PATCH 16/59] Add Auto field to search bar --- lib/components/search_bar.dart | 9 ++++++--- pubspec.lock | 17 +++++------------ 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/lib/components/search_bar.dart b/lib/components/search_bar.dart index fefdc3e..36fecd6 100644 --- a/lib/components/search_bar.dart +++ b/lib/components/search_bar.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; class _LanguageOption extends StatelessWidget { final String _language; + final Color _color; @override Widget build(BuildContext context) { @@ -16,12 +17,13 @@ class _LanguageOption extends StatelessWidget { color: Colors.black, width: 1.0, ), + color: _color ), ), ); } - _LanguageOption(this._language); + _LanguageOption(this._language, this._color); } class SearchBar extends StatelessWidget { @@ -45,8 +47,9 @@ class SearchBar extends StatelessWidget { ), Row( children: [ - _LanguageOption('English'), - _LanguageOption('Japanese'), + _LanguageOption('Auto', Colors.white), + _LanguageOption('English', Colors.white), + _LanguageOption('Japanese', Colors.blue), ], ), ], diff --git a/pubspec.lock b/pubspec.lock index 5f2e93d..84e8413 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -22,13 +22,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" charcode: dependency: transitive description: @@ -49,7 +42,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.13" + version: "1.14.12" csslib: dependency: transitive description: @@ -134,7 +127,7 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.8" + version: "0.12.6" meta: dependency: transitive description: @@ -237,14 +230,14 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.17" + version: "0.2.16" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.1.6" unofficial_jisho_api: dependency: "direct main" description: @@ -295,5 +288,5 @@ packages: source: hosted version: "2.0.8" sdks: - dart: ">=2.9.0-14.0.dev <3.0.0" + dart: ">=2.7.0 <3.0.0" flutter: ">=1.16.0 <2.0.0" From 1efa5174404aaf5df810bdc750b720665699f6b0 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Sat, 11 Jul 2020 13:33:31 +0200 Subject: [PATCH 17/59] Modularize KanjiResultCard --- .../kanji/kanji__search_page/grade.dart | 25 ++ .../kanji/kanji__search_page/header.dart | 22 ++ .../kanji/kanji__search_page/jlpt_level.dart | 26 +++ .../kanji__search_page/kanji_search_page.dart | 83 +++++++ .../kanji/kanji__search_page/radical.dart | 26 +++ .../kanji/kanji__search_page/rank.dart | 26 +++ .../kanji__search_page/stroke_order_gif.dart | 23 ++ .../kanji/{ => kanji_list}/kanji_list.dart | 0 lib/components/kanji/kanji_search_page.dart | 215 ------------------ 9 files changed, 231 insertions(+), 215 deletions(-) create mode 100644 lib/components/kanji/kanji__search_page/grade.dart create mode 100644 lib/components/kanji/kanji__search_page/header.dart create mode 100644 lib/components/kanji/kanji__search_page/jlpt_level.dart create mode 100644 lib/components/kanji/kanji__search_page/kanji_search_page.dart create mode 100644 lib/components/kanji/kanji__search_page/radical.dart create mode 100644 lib/components/kanji/kanji__search_page/rank.dart create mode 100644 lib/components/kanji/kanji__search_page/stroke_order_gif.dart rename lib/components/kanji/{ => kanji_list}/kanji_list.dart (100%) delete mode 100644 lib/components/kanji/kanji_search_page.dart diff --git a/lib/components/kanji/kanji__search_page/grade.dart b/lib/components/kanji/kanji__search_page/grade.dart new file mode 100644 index 0000000..c7422ea --- /dev/null +++ b/lib/components/kanji/kanji__search_page/grade.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +class Grade extends StatelessWidget { + final String _grade; + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(10.0), + child: Text( + _grade, + style: TextStyle( + color: Colors.white, + fontSize: 20.0, + ), + ), + decoration: BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + ); + } + + Grade(this._grade); +} \ No newline at end of file diff --git a/lib/components/kanji/kanji__search_page/header.dart b/lib/components/kanji/kanji__search_page/header.dart new file mode 100644 index 0000000..08d2211 --- /dev/null +++ b/lib/components/kanji/kanji__search_page/header.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +class Header extends StatelessWidget { + final String _kanji; + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0), color: Colors.blue), + child: Padding( + padding: const EdgeInsets.all(10.0), + child: Text( + _kanji, + style: TextStyle(fontSize: 80.0, color: Colors.white), + ), + ), + ); + } + + Header(this._kanji); +} \ No newline at end of file diff --git a/lib/components/kanji/kanji__search_page/jlpt_level.dart b/lib/components/kanji/kanji__search_page/jlpt_level.dart new file mode 100644 index 0000000..4f67fd3 --- /dev/null +++ b/lib/components/kanji/kanji__search_page/jlpt_level.dart @@ -0,0 +1,26 @@ + +import 'package:flutter/material.dart'; + +class JlptLevel extends StatelessWidget { + final String _jlptLevel; + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(10.0), + child: Text( + _jlptLevel, + style: TextStyle( + color: Colors.white, + fontSize: 20.0, + ), + ), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.blue, + ), + ); + } + + JlptLevel(this._jlptLevel); +} \ No newline at end of file diff --git a/lib/components/kanji/kanji__search_page/kanji_search_page.dart b/lib/components/kanji/kanji__search_page/kanji_search_page.dart new file mode 100644 index 0000000..7ca4080 --- /dev/null +++ b/lib/components/kanji/kanji__search_page/kanji_search_page.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; + +import 'package:unofficial_jisho_api/api.dart' as jisho; + +import './grade.dart'; +import './header.dart'; +import './jlpt_level.dart'; +import './radical.dart'; +import './rank.dart'; +import './stroke_order_gif.dart'; + +class KanjiResultCard extends StatelessWidget { + final jisho.KanjiResult _result; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + margin: EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 30.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Flexible( + flex: 1, + fit: FlexFit.tight, + child: Center(child: SizedBox()), + ), + Flexible( + flex: 1, + fit: FlexFit.tight, + child: Center(child: Header(_result.query)), + ), + Flexible( + flex: 1, + fit: FlexFit.tight, + child: Center( + child: Radical(_result.radical), + ), + ), + ], + ), + ), + IntrinsicHeight( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + StrokeOrderGif(_result.strokeOrderGifUri), + Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text("JLPT: ", style: TextStyle(fontSize: 20.0)), + JlptLevel(_result.jlptLevel ?? "⨉"), + ], + ), + Row( + children: [ + Text("Grade: ", style: TextStyle(fontSize: 20.0)), + Grade(_result.taughtIn ?? "⨉"), + ], + ), + Row( + children: [ + Text("Rank: ", style: TextStyle(fontSize: 20.0)), + Rank(_result.newspaperFrequencyRank ?? -1), + ], + ), + ], + ), + ), + ], + ), + ), + ], + ); + } + + KanjiResultCard(this._result); +} diff --git a/lib/components/kanji/kanji__search_page/radical.dart b/lib/components/kanji/kanji__search_page/radical.dart new file mode 100644 index 0000000..fcc952e --- /dev/null +++ b/lib/components/kanji/kanji__search_page/radical.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:unofficial_jisho_api/api.dart' as jisho; + +class Radical extends StatelessWidget { + final jisho.Radical _radical; + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(10.0), + child: Text( + _radical.symbol, + style: TextStyle( + color: Colors.white, + fontSize: 40.0, + ), + ), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.blue, + ), + ); + } + + Radical(this._radical); +} \ No newline at end of file diff --git a/lib/components/kanji/kanji__search_page/rank.dart b/lib/components/kanji/kanji__search_page/rank.dart new file mode 100644 index 0000000..4202398 --- /dev/null +++ b/lib/components/kanji/kanji__search_page/rank.dart @@ -0,0 +1,26 @@ + +import 'package:flutter/material.dart'; + +class Rank extends StatelessWidget { + final int _rank; + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(10.0), + child: Text( + '${_rank.toString()} / 2500', + style: TextStyle( + color: Colors.white, + fontSize: 20.0, + ), + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0), + color: Colors.blue, + ), + ); + } + + Rank(this._rank); +} \ No newline at end of file diff --git a/lib/components/kanji/kanji__search_page/stroke_order_gif.dart b/lib/components/kanji/kanji__search_page/stroke_order_gif.dart new file mode 100644 index 0000000..e99b7da --- /dev/null +++ b/lib/components/kanji/kanji__search_page/stroke_order_gif.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +class StrokeOrderGif extends StatelessWidget { + final String _uri; + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric(vertical: 20.0), + padding: EdgeInsets.all(5.0), + child: ClipRRect( + child: Image.network(_uri), + borderRadius: BorderRadius.circular(10.0), + ), + decoration: BoxDecoration( + color: Colors.blue, + borderRadius: BorderRadius.circular(15.0), + ), + ); + } + + StrokeOrderGif(this._uri); +} \ No newline at end of file diff --git a/lib/components/kanji/kanji_list.dart b/lib/components/kanji/kanji_list/kanji_list.dart similarity index 100% rename from lib/components/kanji/kanji_list.dart rename to lib/components/kanji/kanji_list/kanji_list.dart diff --git a/lib/components/kanji/kanji_search_page.dart b/lib/components/kanji/kanji_search_page.dart deleted file mode 100644 index a5820ae..0000000 --- a/lib/components/kanji/kanji_search_page.dart +++ /dev/null @@ -1,215 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:unofficial_jisho_api/api.dart'; - -class _Header extends StatelessWidget { - final String _kanji; - - @override - Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.0), color: Colors.blue), - child: Padding( - padding: const EdgeInsets.all(10.0), - child: Text( - _kanji, - style: TextStyle(fontSize: 80.0, color: Colors.white), - ), - ), - ); - } - - _Header(this._kanji); -} - -class _Rank extends StatelessWidget { - final int _rank; - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.all(10.0), - child: Text( - '${_rank.toString()} / 2500', - style: TextStyle( - color: Colors.white, - fontSize: 20.0, - ), - ), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.0), - color: Colors.blue, - ), - ); - } - - _Rank(this._rank); -} - -class _JlptLevel extends StatelessWidget { - final String _jlptLevel; - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.all(10.0), - child: Text( - _jlptLevel, - style: TextStyle( - color: Colors.white, - fontSize: 20.0, - ), - ), - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.blue, - ), - ); - } - - _JlptLevel(this._jlptLevel); -} - -class _Grade extends StatelessWidget { - final String _grade; - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.all(10.0), - child: Text( - _grade, - style: TextStyle( - color: Colors.white, - fontSize: 20.0, - ), - ), - decoration: BoxDecoration( - color: Colors.blue, - shape: BoxShape.circle, - ), - ); - } - - _Grade(this._grade); -} - -class _Radical extends StatelessWidget { - final Radical _radical; - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.all(10.0), - child: Text( - _radical.symbol, - style: TextStyle( - color: Colors.white, - fontSize: 40.0, - ), - ), - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.blue, - ), - ); - } - - _Radical(this._radical); -} - -class _StrokeOrderGif extends StatelessWidget { - final String _uri; - - @override - Widget build(BuildContext context) { - return Container( - margin: EdgeInsets.symmetric(vertical: 20.0), - padding: EdgeInsets.all(5.0), - child: ClipRRect( - child: Image.network(_uri), - borderRadius: BorderRadius.circular(10.0), - ), - decoration: BoxDecoration( - color: Colors.blue, - borderRadius: BorderRadius.circular(15.0), - ), - ); - } - - _StrokeOrderGif(this._uri); -} - -class KanjiResultCard extends StatelessWidget { - final KanjiResult _result; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Container( - margin: EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 30.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Flexible( - flex: 1, - fit: FlexFit.tight, - child: Center(child: SizedBox()), - ), - Flexible( - flex: 1, - fit: FlexFit.tight, - child: Center(child: _Header(_result.query)), - ), - Flexible( - flex: 1, - fit: FlexFit.tight, - child: Center( - child: _Radical(_result.radical), - ), - ), - ], - ), - ), - IntrinsicHeight( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _StrokeOrderGif(_result.strokeOrderGifUri), - Container( - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Text("JLPT: ", style: TextStyle(fontSize: 20.0)), - _JlptLevel(_result.jlptLevel ?? "⨉"), - ], - ), - Row( - children: [ - Text("Grade: ", style: TextStyle(fontSize: 20.0)), - _Grade(_result.taughtIn ?? "⨉"), - ], - ), - Row( - children: [ - Text("Rank: ", style: TextStyle(fontSize: 20.0)), - _Rank(_result.newspaperFrequencyRank ?? -1), - ], - ), - ], - ), - ), - ], - ), - ), - ], - ); - } - - KanjiResultCard(this._result); -} From dc2cf43d7bedc32df4118b00846b1621fedefb6a Mon Sep 17 00:00:00 2001 From: h7x4 Date: Sat, 11 Jul 2020 13:37:46 +0200 Subject: [PATCH 18/59] Finish restructure --- .../jisho_search.dart => bloc/temporary_provider.dart} | 4 ++-- lib/components/kanji/{ => kanji__search_page}/yomi_card.dart | 0 lib/screens/kanji_search.dart | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename lib/{services/jisho_search.dart => bloc/temporary_provider.dart} (77%) rename lib/components/kanji/{ => kanji__search_page}/yomi_card.dart (100%) diff --git a/lib/services/jisho_search.dart b/lib/bloc/temporary_provider.dart similarity index 77% rename from lib/services/jisho_search.dart rename to lib/bloc/temporary_provider.dart index e10dcab..62294fd 100644 --- a/lib/services/jisho_search.dart +++ b/lib/bloc/temporary_provider.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import './kanji_search.dart'; import 'package:unofficial_jisho_api/api.dart' as jisho; -import 'package:jisho_study_tool/components/kanji/kanji_search_page.dart'; +import 'package:jisho_study_tool/components/kanji/kanji__search_page/kanji_search_page.dart'; +import 'package:jisho_study_tool/services/kanji_search.dart'; Widget searchForKanji(String kanji) { return FutureBuilder( diff --git a/lib/components/kanji/yomi_card.dart b/lib/components/kanji/kanji__search_page/yomi_card.dart similarity index 100% rename from lib/components/kanji/yomi_card.dart rename to lib/components/kanji/kanji__search_page/yomi_card.dart diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index b532237..719b728 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:jisho_study_tool/services/jisho_search.dart'; +import 'package:jisho_study_tool/bloc/temporary_provider.dart'; class KanjiView extends StatelessWidget { @override Widget build(BuildContext context) { return searchForKanji('黽'); } -} +} \ No newline at end of file From 8480bb12a405bbb182dfffa9de819b8389ea7570 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Sun, 12 Jul 2020 23:58:30 +0200 Subject: [PATCH 19/59] Add onyomi and kunyomi --- lib/components/kanji/kanji__search_page/kunyomi.dart | 10 ++++++++++ lib/components/kanji/kanji__search_page/onyomi.dart | 10 ++++++++++ 2 files changed, 20 insertions(+) create mode 100644 lib/components/kanji/kanji__search_page/kunyomi.dart create mode 100644 lib/components/kanji/kanji__search_page/onyomi.dart diff --git a/lib/components/kanji/kanji__search_page/kunyomi.dart b/lib/components/kanji/kanji__search_page/kunyomi.dart new file mode 100644 index 0000000..39e490c --- /dev/null +++ b/lib/components/kanji/kanji__search_page/kunyomi.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class Kunyomi extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + + ); + } +} \ No newline at end of file diff --git a/lib/components/kanji/kanji__search_page/onyomi.dart b/lib/components/kanji/kanji__search_page/onyomi.dart new file mode 100644 index 0000000..4878814 --- /dev/null +++ b/lib/components/kanji/kanji__search_page/onyomi.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class Onyomi extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + + ); + } +} \ No newline at end of file From 2b11f5f8c23b374afb74e622c7630056b21d1297 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Mon, 13 Jul 2020 15:18:17 +0200 Subject: [PATCH 20/59] Add bloc logic --- lib/bloc/kanji/kanji_bloc.dart | 19 ++++++++++++++----- lib/bloc/kanji/kanji_event.dart | 11 ++++++++--- lib/bloc/kanji/kanji_state.dart | 27 ++++++++++++++++++++------- 3 files changed, 42 insertions(+), 15 deletions(-) diff --git a/lib/bloc/kanji/kanji_bloc.dart b/lib/bloc/kanji/kanji_bloc.dart index 40a8030..cfeb0d3 100644 --- a/lib/bloc/kanji/kanji_bloc.dart +++ b/lib/bloc/kanji/kanji_bloc.dart @@ -1,18 +1,27 @@ import 'dart:async'; -import 'package:bloc/bloc.dart'; -import 'package:meta/meta.dart'; +import './kanji_event.dart'; +import './kanji_state.dart'; -part 'kanji_event.dart'; -part 'kanji_state.dart'; +import 'package:bloc/bloc.dart'; +import 'package:jisho_study_tool/services/kanji_search.dart'; class KanjiBloc extends Bloc { + KanjiBloc() : super(KanjiSearchInitial()); @override Stream mapEventToState( KanjiEvent event, ) async* { - // TODO: implement mapEventToState + yield KanjiSearchLoading(); + if (event is GetKanji) { + try { + final _kanji = await fetchKanji(event.kanjiSearchString); + yield KanjiSearchFinished(_kanji); + } on Exception { + yield KanjiSearchError('Something went wrong'); + } + } } } diff --git a/lib/bloc/kanji/kanji_event.dart b/lib/bloc/kanji/kanji_event.dart index d2475d0..4bc28bf 100644 --- a/lib/bloc/kanji/kanji_event.dart +++ b/lib/bloc/kanji/kanji_event.dart @@ -1,4 +1,9 @@ -part of 'kanji_bloc.dart'; +abstract class KanjiEvent { + const KanjiEvent(); +} -@immutable -abstract class KanjiEvent {} +class GetKanji extends KanjiEvent { + final String kanjiSearchString; + + GetKanji(this.kanjiSearchString); +} \ No newline at end of file diff --git a/lib/bloc/kanji/kanji_state.dart b/lib/bloc/kanji/kanji_state.dart index 5013d25..bd9917e 100644 --- a/lib/bloc/kanji/kanji_state.dart +++ b/lib/bloc/kanji/kanji_state.dart @@ -1,14 +1,27 @@ -part of 'kanji_bloc.dart'; +import 'package:unofficial_jisho_api/api.dart'; -@immutable -abstract class KanjiState {} +abstract class KanjiState { + const KanjiState(); +} -class KanjiSearchInitial extends KanjiState {} +class KanjiSearchInitial extends KanjiState { + KanjiSearchInitial(); +} -class KanjiSearchLoading extends KanjiState {} +class KanjiSearchLoading extends KanjiState { + KanjiSearchLoading(); +} -class KanjiSearchFinished extends KanjiState {} +class KanjiSearchFinished extends KanjiState { + final KanjiResult kanji; -class KanjiSearchError extends KanjiState {} + KanjiSearchFinished(this.kanji); +} + +class KanjiSearchError extends KanjiState { + final String message; + + KanjiSearchError(this.message); +} class ReKanjiSearch extends KanjiState {} From d5782f5e56094600957becad410879031cd0465f Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Mon, 13 Jul 2020 21:21:33 +0200 Subject: [PATCH 21/59] Implement Bloc --- lib/bloc/kanji/kanji_bloc.dart | 3 ++ lib/components/loading.dart | 12 ++++++ lib/screens/kanji_search.dart | 41 ++++++++++++++++++++- lib/screens/kanji_search/initial_state.dart | 10 +++++ 4 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 lib/components/loading.dart create mode 100644 lib/screens/kanji_search/initial_state.dart diff --git a/lib/bloc/kanji/kanji_bloc.dart b/lib/bloc/kanji/kanji_bloc.dart index cfeb0d3..c7c6a47 100644 --- a/lib/bloc/kanji/kanji_bloc.dart +++ b/lib/bloc/kanji/kanji_bloc.dart @@ -6,6 +6,9 @@ import './kanji_state.dart'; import 'package:bloc/bloc.dart'; import 'package:jisho_study_tool/services/kanji_search.dart'; +export './kanji_event.dart'; +export './kanji_state.dart'; + class KanjiBloc extends Bloc { KanjiBloc() : super(KanjiSearchInitial()); diff --git a/lib/components/loading.dart b/lib/components/loading.dart new file mode 100644 index 0000000..327c44c --- /dev/null +++ b/lib/components/loading.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +class LoadingScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + child: Center( + child: CircularProgressIndicator(), + ), + ); + } +} diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index 719b728..41ad316 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -1,9 +1,46 @@ import 'package:flutter/material.dart'; -import 'package:jisho_study_tool/bloc/temporary_provider.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'package:jisho_study_tool/bloc/kanji/kanji_bloc.dart'; +import 'package:jisho_study_tool/components/kanji/kanji__search_page/kanji_search_page.dart'; +import 'package:jisho_study_tool/components/loading.dart'; class KanjiView extends StatelessWidget { @override Widget build(BuildContext context) { - return searchForKanji('黽'); + return BlocProvider( + create: (context) => KanjiBloc(), + child: _KanjiSearchPage(), + ); + } +} + +class _KanjiSearchPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BlocBuilder( + builder: (context, state) { + if (state is KanjiSearchInitial) return KanjiSearchBar(); + else if (state is KanjiSearchLoading) return LoadingScreen(); + else if (state is KanjiSearchFinished) return KanjiResultCard(state.kanji); + + throw 'No such event found'; + }, + ); + } +} + +class KanjiSearchBar extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Center( + child: TextField( + onSubmitted: (text) => BlocProvider.of(context).add(GetKanji(text)), + decoration: new InputDecoration( + prefixIcon: Icon(Icons.search), + hintText: 'Search for kanji' + ), + ), + ); } } \ No newline at end of file diff --git a/lib/screens/kanji_search/initial_state.dart b/lib/screens/kanji_search/initial_state.dart new file mode 100644 index 0000000..d765bbb --- /dev/null +++ b/lib/screens/kanji_search/initial_state.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class InitialState extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Center( + child: TextField(), + ); + } +} \ No newline at end of file From 0a9dba4d2e6e463fec34d4bc15a8fe2bbcbbde26 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Mon, 13 Jul 2020 21:38:24 +0200 Subject: [PATCH 22/59] Move searchbar --- lib/components/search_bar.dart | 59 ---------------------------------- lib/screens/search.dart | 57 +++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 60 deletions(-) delete mode 100644 lib/components/search_bar.dart diff --git a/lib/components/search_bar.dart b/lib/components/search_bar.dart deleted file mode 100644 index 36fecd6..0000000 --- a/lib/components/search_bar.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'dart:io'; - -import 'package:flutter/material.dart'; - -class _LanguageOption extends StatelessWidget { - final String _language; - final Color _color; - - @override - Widget build(BuildContext context) { - return Expanded( - child: Container( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: Center(child: Text(_language)), - decoration: BoxDecoration( - border: Border.all( - color: Colors.black, - width: 1.0, - ), - color: _color - ), - ), - ); - } - - _LanguageOption(this._language, this._color); -} - -class SearchBar extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 20.0), - child: Column( - children: [ - TextField( - controller: TextEditingController(), - decoration: InputDecoration( - labelText: 'Search', - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0), - ), - ), - ), - SizedBox( - height: 10.0, - ), - Row( - children: [ - _LanguageOption('Auto', Colors.white), - _LanguageOption('English', Colors.white), - _LanguageOption('Japanese', Colors.blue), - ], - ), - ], - ), - ); - } -} diff --git a/lib/screens/search.dart b/lib/screens/search.dart index fbf9b9f..a28cc49 100644 --- a/lib/screens/search.dart +++ b/lib/screens/search.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:jisho_study_tool/components/search_bar.dart'; class SearchView extends StatelessWidget { @override @@ -11,4 +10,60 @@ class SearchView extends StatelessWidget { ], ); } +} + +class _LanguageOption extends StatelessWidget { + final String _language; + final Color _color; + + @override + Widget build(BuildContext context) { + return Expanded( + child: Container( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: Center(child: Text(_language)), + decoration: BoxDecoration( + border: Border.all( + color: Colors.black, + width: 1.0, + ), + color: _color + ), + ), + ); + } + + _LanguageOption(this._language, this._color); +} + +class SearchBar extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 20.0), + child: Column( + children: [ + TextField( + controller: TextEditingController(), + decoration: InputDecoration( + labelText: 'Search', + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10.0), + ), + ), + ), + SizedBox( + height: 10.0, + ), + Row( + children: [ + _LanguageOption('Auto', Colors.white), + _LanguageOption('English', Colors.white), + _LanguageOption('Japanese', Colors.blue), + ], + ), + ], + ), + ); + } } \ No newline at end of file From b45a661cff0c55c2b05d444a7733d1053ab469ff Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Mon, 13 Jul 2020 23:39:16 +0200 Subject: [PATCH 23/59] add final keyword to nav list --- lib/main.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 479d717..59a66f0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -52,7 +52,7 @@ class _HomeState extends State { } } -List navBar = [ +final List navBar = [ BottomNavigationBarItem( title: Text('Search'), icon: Icon(Icons.search), @@ -85,7 +85,7 @@ class Page { Page({this.title, this.content}); } -List pages = [ +final List pages = [ Page( title: "Search", content: SearchView(), From 3f813790970e94d12e4e299574f4c6f5e35df161 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Mon, 13 Jul 2020 23:39:26 +0200 Subject: [PATCH 24/59] Add history bloc --- lib/bloc/history/bloc/history_bloc.dart | 18 ++++++++++++++++++ lib/bloc/history/bloc/history_event.dart | 4 ++++ lib/bloc/history/bloc/history_state.dart | 6 ++++++ 3 files changed, 28 insertions(+) create mode 100644 lib/bloc/history/bloc/history_bloc.dart create mode 100644 lib/bloc/history/bloc/history_event.dart create mode 100644 lib/bloc/history/bloc/history_state.dart diff --git a/lib/bloc/history/bloc/history_bloc.dart b/lib/bloc/history/bloc/history_bloc.dart new file mode 100644 index 0000000..9396c8c --- /dev/null +++ b/lib/bloc/history/bloc/history_bloc.dart @@ -0,0 +1,18 @@ +import 'dart:async'; + +import 'package:bloc/bloc.dart'; +import 'package:meta/meta.dart'; + +part 'history_event.dart'; +part 'history_state.dart'; + +class HistoryBloc extends Bloc { + HistoryBloc() : super(HistoryInitial()); + + @override + Stream mapEventToState( + HistoryEvent event, + ) async* { + // TODO: implement mapEventToState + } +} diff --git a/lib/bloc/history/bloc/history_event.dart b/lib/bloc/history/bloc/history_event.dart new file mode 100644 index 0000000..40ede67 --- /dev/null +++ b/lib/bloc/history/bloc/history_event.dart @@ -0,0 +1,4 @@ +part of 'history_bloc.dart'; + +@immutable +abstract class HistoryEvent {} diff --git a/lib/bloc/history/bloc/history_state.dart b/lib/bloc/history/bloc/history_state.dart new file mode 100644 index 0000000..57b69b2 --- /dev/null +++ b/lib/bloc/history/bloc/history_state.dart @@ -0,0 +1,6 @@ +part of 'history_bloc.dart'; + +@immutable +abstract class HistoryState {} + +class HistoryInitial extends HistoryState {} From 8ee5dc7f583bc89c540df77350fcbb34eb797e07 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Mon, 13 Jul 2020 23:41:31 +0200 Subject: [PATCH 25/59] Rename log to history --- lib/main.dart | 8 ++++---- lib/screens/{log.dart => history.dart} | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) rename lib/screens/{log.dart => history.dart} (80%) diff --git a/lib/main.dart b/lib/main.dart index 59a66f0..0834a07 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:jisho_study_tool/screens/kanji_search.dart'; -import 'package:jisho_study_tool/screens/log.dart'; +import 'package:jisho_study_tool/screens/history.dart'; import 'package:jisho_study_tool/screens/search.dart'; void main() => runApp(MyApp()); @@ -65,7 +65,7 @@ final List navBar = [ ), ), BottomNavigationBarItem( - title: Text('Log'), + title: Text('History'), icon: Icon(Icons.bookmark), ), BottomNavigationBarItem( @@ -95,8 +95,8 @@ final List pages = [ content: KanjiView(), ), Page( - title: "Log", - content: LogView(), + title: "History", + content: HistoryView(), ), Page( title: "Memorization", diff --git a/lib/screens/log.dart b/lib/screens/history.dart similarity index 80% rename from lib/screens/log.dart rename to lib/screens/history.dart index 2718588..0b16214 100644 --- a/lib/screens/log.dart +++ b/lib/screens/history.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -class LogView extends StatelessWidget { +class HistoryView extends StatelessWidget { @override Widget build(BuildContext context) { return ListView.builder( From d126f545004505414145f74c5281af06c3d18a6e Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Tue, 14 Jul 2020 00:09:54 +0200 Subject: [PATCH 26/59] Add event for returning to initial state --- lib/bloc/kanji/kanji_bloc.dart | 7 ++++++- lib/bloc/kanji/kanji_event.dart | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/bloc/kanji/kanji_bloc.dart b/lib/bloc/kanji/kanji_bloc.dart index c7c6a47..b9033bf 100644 --- a/lib/bloc/kanji/kanji_bloc.dart +++ b/lib/bloc/kanji/kanji_bloc.dart @@ -17,14 +17,19 @@ class KanjiBloc extends Bloc { Stream mapEventToState( KanjiEvent event, ) async* { - yield KanjiSearchLoading(); if (event is GetKanji) { + + yield KanjiSearchLoading(); + try { final _kanji = await fetchKanji(event.kanjiSearchString); yield KanjiSearchFinished(_kanji); } on Exception { yield KanjiSearchError('Something went wrong'); } + + } else if (event is ReturnToInitialState) { + yield KanjiSearchInitial(); } } } diff --git a/lib/bloc/kanji/kanji_event.dart b/lib/bloc/kanji/kanji_event.dart index 4bc28bf..6bbe8e5 100644 --- a/lib/bloc/kanji/kanji_event.dart +++ b/lib/bloc/kanji/kanji_event.dart @@ -6,4 +6,8 @@ class GetKanji extends KanjiEvent { final String kanjiSearchString; GetKanji(this.kanjiSearchString); +} + +class ReturnToInitialState extends KanjiEvent { + ReturnToInitialState(); } \ No newline at end of file From 9204ce4cfd3e2f6c91828f673eeecadaf39bf26c Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Tue, 14 Jul 2020 12:52:48 +0200 Subject: [PATCH 27/59] Make titlebar modular --- lib/main.dart | 16 ++++++++-------- lib/screens/kanji_search.dart | 7 +++++++ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 0834a07..2d3e205 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -31,7 +31,7 @@ class _HomeState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(pages[_selectedPage].title), + title: pages[_selectedPage].titleBar, centerTitle: true, ), body: pages[_selectedPage].content, @@ -79,31 +79,31 @@ final List navBar = [ ]; class Page { - String title; Widget content; + Widget titleBar; - Page({this.title, this.content}); + Page({ this.content,this.titleBar,}); } final List pages = [ Page( - title: "Search", content: SearchView(), + titleBar: Text('Search') ), Page( - title: "Kanji", content: KanjiView(), + titleBar: KanjiViewBar(), ), Page( - title: "History", content: HistoryView(), + titleBar: Text("History"), ), Page( - title: "Memorization", content: Container(), + titleBar: Text("Memorization"), ), Page( - title: "Settings", content: Container(), + titleBar: Text("Settings"), ), ]; diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index 41ad316..1a60ff6 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -30,6 +30,13 @@ class _KanjiSearchPage extends StatelessWidget { } } +class KanjiViewBar extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Text('Kanji'); + } +} + class KanjiSearchBar extends StatelessWidget { @override Widget build(BuildContext context) { From bd87af4a38aa85a0700213283e0c3f452e8f6fd1 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Tue, 14 Jul 2020 14:33:21 +0200 Subject: [PATCH 28/59] Add search bar to title bar --- lib/main.dart | 22 ++++++++--- lib/screens/kanji_search.dart | 69 +++++++++++++++++++++-------------- 2 files changed, 58 insertions(+), 33 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 2d3e205..7e91207 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,8 +1,12 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:jisho_study_tool/bloc/kanji/kanji_bloc.dart'; import 'package:jisho_study_tool/screens/kanji_search.dart'; import 'package:jisho_study_tool/screens/history.dart'; import 'package:jisho_study_tool/screens/search.dart'; +import 'bloc/search/search_bloc.dart'; + void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @@ -14,7 +18,13 @@ class MyApp extends StatelessWidget { theme: ThemeData( primarySwatch: Colors.blue, ), - home: Home(), + home: MultiBlocProvider( + providers: [ + BlocProvider(create: (context) => SearchBloc()), + BlocProvider(create: (context) => KanjiBloc()), + ], + child: Home(), + ), ); } } @@ -82,14 +92,14 @@ class Page { Widget content; Widget titleBar; - Page({ this.content,this.titleBar,}); + Page({ + this.content, + this.titleBar, + }); } final List pages = [ - Page( - content: SearchView(), - titleBar: Text('Search') - ), + Page(content: SearchView(), titleBar: Text('Search')), Page( content: KanjiView(), titleBar: KanjiViewBar(), diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index 1a60ff6..148f8d7 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -6,24 +6,17 @@ import 'package:jisho_study_tool/components/kanji/kanji__search_page/kanji_searc import 'package:jisho_study_tool/components/loading.dart'; class KanjiView extends StatelessWidget { - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (context) => KanjiBloc(), - child: _KanjiSearchPage(), - ); - } -} - -class _KanjiSearchPage extends StatelessWidget { @override Widget build(BuildContext context) { return BlocBuilder( builder: (context, state) { - if (state is KanjiSearchInitial) return KanjiSearchBar(); - else if (state is KanjiSearchLoading) return LoadingScreen(); - else if (state is KanjiSearchFinished) return KanjiResultCard(state.kanji); - + if (state is KanjiSearchInitial) + return Container(); + else if (state is KanjiSearchLoading) + return LoadingScreen(); + else if (state is KanjiSearchFinished) + return KanjiResultCard(state.kanji); + throw 'No such event found'; }, ); @@ -31,23 +24,45 @@ class _KanjiSearchPage extends StatelessWidget { } class KanjiViewBar extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Text('Kanji'); - } -} - -class KanjiSearchBar extends StatelessWidget { @override Widget build(BuildContext context) { return Center( - child: TextField( - onSubmitted: (text) => BlocProvider.of(context).add(GetKanji(text)), - decoration: new InputDecoration( - prefixIcon: Icon(Icons.search), - hintText: 'Search for kanji' + child: Container( + child: Row( + children: [ + IconButton( + icon: Icon(Icons.arrow_back), + onPressed: () => BlocProvider.of(context) + .add(ReturnToInitialState()), + ), + Expanded( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextField( + onSubmitted: (text) => + BlocProvider.of(context).add(GetKanji(text)), + decoration: new InputDecoration( + prefixIcon: Icon(Icons.search), + hintText: 'Search for kanji', + fillColor: Colors.white, + filled: true, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(100.0)), + ), + ), + ), + ), + IconButton( + icon: Icon(Icons.star_border), + onPressed: null, + ), + IconButton( + icon: Icon(Icons.add), + onPressed: null, + ), + ], ), ), ); } -} \ No newline at end of file +} From c1a494fd9a2a11421053f62c6f71f27180e40178 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Tue, 14 Jul 2020 14:44:06 +0200 Subject: [PATCH 29/59] fix backbutton --- lib/screens/kanji_search.dart | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index 148f8d7..a59211e 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -15,8 +15,12 @@ class KanjiView extends StatelessWidget { else if (state is KanjiSearchLoading) return LoadingScreen(); else if (state is KanjiSearchFinished) - return KanjiResultCard(state.kanji); - + return WillPopScope( + child: KanjiResultCard(state.kanji), + onWillPop: () async { + BlocProvider.of(context).add(ReturnToInitialState()); + return false; + }); throw 'No such event found'; }, ); From 920ad17e4c63d764365be0e8dc6429f0f51bf44c Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Tue, 14 Jul 2020 14:57:03 +0200 Subject: [PATCH 30/59] Added starred to kanji state --- lib/bloc/kanji/kanji_bloc.dart | 2 +- lib/bloc/kanji/kanji_state.dart | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/bloc/kanji/kanji_bloc.dart b/lib/bloc/kanji/kanji_bloc.dart index b9033bf..845251e 100644 --- a/lib/bloc/kanji/kanji_bloc.dart +++ b/lib/bloc/kanji/kanji_bloc.dart @@ -23,7 +23,7 @@ class KanjiBloc extends Bloc { try { final _kanji = await fetchKanji(event.kanjiSearchString); - yield KanjiSearchFinished(_kanji); + yield KanjiSearchFinished(kanji: _kanji); } on Exception { yield KanjiSearchError('Something went wrong'); } diff --git a/lib/bloc/kanji/kanji_state.dart b/lib/bloc/kanji/kanji_state.dart index bd9917e..7e5aff2 100644 --- a/lib/bloc/kanji/kanji_state.dart +++ b/lib/bloc/kanji/kanji_state.dart @@ -14,8 +14,12 @@ class KanjiSearchLoading extends KanjiState { class KanjiSearchFinished extends KanjiState { final KanjiResult kanji; + final bool starred; - KanjiSearchFinished(this.kanji); + KanjiSearchFinished({ + this.kanji, + this.starred = false, + }); } class KanjiSearchError extends KanjiState { From 45119e2a34835108e567c7cb6be119025aff31ba Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Tue, 14 Jul 2020 14:59:54 +0200 Subject: [PATCH 31/59] Remove empty file --- lib/screens/kanji_search/initial_state.dart | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 lib/screens/kanji_search/initial_state.dart diff --git a/lib/screens/kanji_search/initial_state.dart b/lib/screens/kanji_search/initial_state.dart deleted file mode 100644 index d765bbb..0000000 --- a/lib/screens/kanji_search/initial_state.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter/material.dart'; - -class InitialState extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Center( - child: TextField(), - ); - } -} \ No newline at end of file From 0bd4dad7723c40bc908163e0a14cec227a979ab9 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Tue, 14 Jul 2020 15:39:31 +0200 Subject: [PATCH 32/59] Add layout to yomi --- .../kanji__search_page/kanji_search_page.dart | 5 +++ .../kanji/kanji__search_page/kunyomi.dart | 35 +++++++++++++++++-- .../kanji/kanji__search_page/onyomi.dart | 33 +++++++++++++++-- 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/lib/components/kanji/kanji__search_page/kanji_search_page.dart b/lib/components/kanji/kanji__search_page/kanji_search_page.dart index 7ca4080..8bf98e1 100644 --- a/lib/components/kanji/kanji__search_page/kanji_search_page.dart +++ b/lib/components/kanji/kanji__search_page/kanji_search_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:jisho_study_tool/components/kanji/kanji__search_page/kunyomi.dart'; import 'package:unofficial_jisho_api/api.dart' as jisho; @@ -8,6 +9,8 @@ import './jlpt_level.dart'; import './radical.dart'; import './rank.dart'; import './stroke_order_gif.dart'; +import './onyomi.dart'; +import './kunyomi.dart'; class KanjiResultCard extends StatelessWidget { final jisho.KanjiResult _result; @@ -41,6 +44,8 @@ class KanjiResultCard extends StatelessWidget { ], ), ), + _result.onyomi.length != 0 ? Onyomi(_result.onyomi) : SizedBox.shrink(), + _result.kunyomi.length != 0 ? Kunyomi(_result.kunyomi) : SizedBox.shrink(), IntrinsicHeight( child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, diff --git a/lib/components/kanji/kanji__search_page/kunyomi.dart b/lib/components/kanji/kanji__search_page/kunyomi.dart index 39e490c..146b10c 100644 --- a/lib/components/kanji/kanji__search_page/kunyomi.dart +++ b/lib/components/kanji/kanji__search_page/kunyomi.dart @@ -1,10 +1,41 @@ import 'package:flutter/material.dart'; class Kunyomi extends StatelessWidget { + final List _kunyomi; + @override Widget build(BuildContext context) { return Container( - + child: Container( + margin: EdgeInsets.symmetric( + horizontal: 10.0, + vertical: 5.0, + ), + child: Row( + children: _kunyomi.map((onyomi) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 10.0), + padding: EdgeInsets.symmetric( + vertical: 10.0, + horizontal: 10.0, + ), + child: Text( + onyomi, + style: TextStyle( + fontSize: 20.0, + color: Colors.white, + ), + ), + decoration: BoxDecoration( + color: Colors.lightBlue, + borderRadius: BorderRadius.circular(10.0), + ), + ); + }).toList(), + ), + ), ); } -} \ No newline at end of file + + Kunyomi(this._kunyomi); +} diff --git a/lib/components/kanji/kanji__search_page/onyomi.dart b/lib/components/kanji/kanji__search_page/onyomi.dart index 4878814..77c37d9 100644 --- a/lib/components/kanji/kanji__search_page/onyomi.dart +++ b/lib/components/kanji/kanji__search_page/onyomi.dart @@ -1,10 +1,39 @@ import 'package:flutter/material.dart'; class Onyomi extends StatelessWidget { + final List _onyomi; + @override Widget build(BuildContext context) { return Container( - + margin: EdgeInsets.symmetric( + horizontal: 10.0, + vertical: 5.0, + ), + child: Row( + children: _onyomi.map((onyomi) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 10.0), + padding: EdgeInsets.symmetric( + vertical: 10.0, + horizontal: 10.0, + ), + child: Text( + onyomi, + style: TextStyle( + fontSize: 20.0, + color: Colors.white, + ), + ), + decoration: BoxDecoration( + color: Colors.orange, + borderRadius: BorderRadius.circular(10.0), + ), + ); + }).toList(), + ), ); } -} \ No newline at end of file + + Onyomi(this._onyomi); +} From 9633693c9b815b8413890347757ed3ee7b59354f Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 16 Jul 2020 14:08:02 +0200 Subject: [PATCH 33/59] Remove center widget --- lib/screens/kanji_search.dart | 64 +++++++++++++++++------------------ 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index a59211e..03f9100 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -30,42 +30,40 @@ class KanjiView extends StatelessWidget { class KanjiViewBar extends StatelessWidget { @override Widget build(BuildContext context) { - return Center( - child: Container( - child: Row( - children: [ - IconButton( - icon: Icon(Icons.arrow_back), - onPressed: () => BlocProvider.of(context) - .add(ReturnToInitialState()), - ), - Expanded( - child: Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: TextField( - onSubmitted: (text) => - BlocProvider.of(context).add(GetKanji(text)), - decoration: new InputDecoration( - prefixIcon: Icon(Icons.search), - hintText: 'Search for kanji', - fillColor: Colors.white, - filled: true, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(100.0)), - ), + return Container( + child: Row( + children: [ + IconButton( + icon: Icon(Icons.arrow_back), + onPressed: () => BlocProvider.of(context) + .add(ReturnToInitialState()), + ), + Expanded( + child: Container( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextField( + onSubmitted: (text) => + BlocProvider.of(context).add(GetKanji(text)), + decoration: new InputDecoration( + prefixIcon: Icon(Icons.search), + hintText: 'Search for kanji', + fillColor: Colors.white, + filled: true, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(100.0)), ), ), ), - IconButton( - icon: Icon(Icons.star_border), - onPressed: null, - ), - IconButton( - icon: Icon(Icons.add), - onPressed: null, - ), - ], - ), + ), + IconButton( + icon: Icon(Icons.star_border), + onPressed: null, + ), + IconButton( + icon: Icon(Icons.add), + onPressed: null, + ), + ], ), ); } From e254d128a3b45204ca41dcfd5b29bfb010f92be6 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 16 Jul 2020 14:08:35 +0200 Subject: [PATCH 34/59] Add error check for kanji search --- lib/bloc/kanji/kanji_bloc.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/bloc/kanji/kanji_bloc.dart b/lib/bloc/kanji/kanji_bloc.dart index 845251e..593baf2 100644 --- a/lib/bloc/kanji/kanji_bloc.dart +++ b/lib/bloc/kanji/kanji_bloc.dart @@ -23,7 +23,8 @@ class KanjiBloc extends Bloc { try { final _kanji = await fetchKanji(event.kanjiSearchString); - yield KanjiSearchFinished(kanji: _kanji); + if (_kanji.found) yield KanjiSearchFinished(kanji: _kanji); + else yield KanjiSearchError('Something went wrong'); } on Exception { yield KanjiSearchError('Something went wrong'); } From a695c3f10626435dc419d8555efff371502426b6 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 16 Jul 2020 14:08:51 +0200 Subject: [PATCH 35/59] Add meaning widget --- .../kanji__search_page/kanji_search_page.dart | 3 +- .../kanji/kanji__search_page/meaning.dart | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 lib/components/kanji/kanji__search_page/meaning.dart diff --git a/lib/components/kanji/kanji__search_page/kanji_search_page.dart b/lib/components/kanji/kanji__search_page/kanji_search_page.dart index 8bf98e1..5f3b231 100644 --- a/lib/components/kanji/kanji__search_page/kanji_search_page.dart +++ b/lib/components/kanji/kanji__search_page/kanji_search_page.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:jisho_study_tool/components/kanji/kanji__search_page/kunyomi.dart'; import 'package:unofficial_jisho_api/api.dart' as jisho; import './grade.dart'; import './header.dart'; import './jlpt_level.dart'; +import './meaning.dart'; import './radical.dart'; import './rank.dart'; import './stroke_order_gif.dart'; @@ -44,6 +44,7 @@ class KanjiResultCard extends StatelessWidget { ], ), ), + Meaning(_result.meaning), _result.onyomi.length != 0 ? Onyomi(_result.onyomi) : SizedBox.shrink(), _result.kunyomi.length != 0 ? Kunyomi(_result.kunyomi) : SizedBox.shrink(), IntrinsicHeight( diff --git a/lib/components/kanji/kanji__search_page/meaning.dart b/lib/components/kanji/kanji__search_page/meaning.dart new file mode 100644 index 0000000..4730a42 --- /dev/null +++ b/lib/components/kanji/kanji__search_page/meaning.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +class Meaning extends StatelessWidget { + String _meaning; + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric( + horizontal: 10.0, + vertical: 5.0, + ), + alignment: Alignment.centerLeft, + child: Wrap( + runSpacing: 10.0, + children: _meaning + .split(',') + .map((meaning) => Container( + margin: EdgeInsets.symmetric(horizontal: 10.0), + child: Text(meaning), + )) + .toList(), + ), + ); + } + + Meaning(this._meaning); +} From eb3caf16bdada3d33661422afc12eb011209fe93 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 16 Jul 2020 14:09:03 +0200 Subject: [PATCH 36/59] Make yomi widgets wrap --- .../kanji/kanji__search_page/kunyomi.dart | 52 +++++++++---------- .../kanji/kanji__search_page/onyomi.dart | 4 +- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/lib/components/kanji/kanji__search_page/kunyomi.dart b/lib/components/kanji/kanji__search_page/kunyomi.dart index 146b10c..09164d3 100644 --- a/lib/components/kanji/kanji__search_page/kunyomi.dart +++ b/lib/components/kanji/kanji__search_page/kunyomi.dart @@ -6,33 +6,33 @@ class Kunyomi extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - child: Container( - margin: EdgeInsets.symmetric( - horizontal: 10.0, - vertical: 5.0, - ), - child: Row( - children: _kunyomi.map((onyomi) { - return Container( - margin: EdgeInsets.symmetric(horizontal: 10.0), - padding: EdgeInsets.symmetric( - vertical: 10.0, - horizontal: 10.0, + margin: EdgeInsets.symmetric( + horizontal: 10.0, + vertical: 5.0, + ), + alignment: Alignment.centerLeft, + child: Wrap( + runSpacing: 10.0, + children: _kunyomi.map((onyomi) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 10.0), + padding: EdgeInsets.symmetric( + vertical: 10.0, + horizontal: 10.0, + ), + child: Text( + onyomi, + style: TextStyle( + fontSize: 20.0, + color: Colors.white, ), - child: Text( - onyomi, - style: TextStyle( - fontSize: 20.0, - color: Colors.white, - ), - ), - decoration: BoxDecoration( - color: Colors.lightBlue, - borderRadius: BorderRadius.circular(10.0), - ), - ); - }).toList(), - ), + ), + decoration: BoxDecoration( + color: Colors.lightBlue, + borderRadius: BorderRadius.circular(10.0), + ), + ); + }).toList(), ), ); } diff --git a/lib/components/kanji/kanji__search_page/onyomi.dart b/lib/components/kanji/kanji__search_page/onyomi.dart index 77c37d9..3d8cc9b 100644 --- a/lib/components/kanji/kanji__search_page/onyomi.dart +++ b/lib/components/kanji/kanji__search_page/onyomi.dart @@ -10,7 +10,9 @@ class Onyomi extends StatelessWidget { horizontal: 10.0, vertical: 5.0, ), - child: Row( + alignment: Alignment.centerLeft, + child: Wrap( + runSpacing: 10.0, children: _onyomi.map((onyomi) { return Container( margin: EdgeInsets.symmetric(horizontal: 10.0), From 5c04142c2adcadb50a0013077406d13e8f34fa05 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 16 Jul 2020 18:44:18 +0200 Subject: [PATCH 37/59] Remove redundant code --- lib/bloc/temporary_provider.dart | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 lib/bloc/temporary_provider.dart diff --git a/lib/bloc/temporary_provider.dart b/lib/bloc/temporary_provider.dart deleted file mode 100644 index 62294fd..0000000 --- a/lib/bloc/temporary_provider.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:unofficial_jisho_api/api.dart' as jisho; - -import 'package:jisho_study_tool/components/kanji/kanji__search_page/kanji_search_page.dart'; -import 'package:jisho_study_tool/services/kanji_search.dart'; - -Widget searchForKanji(String kanji) { - return FutureBuilder( - future: fetchKanji(kanji), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasData) { - return KanjiResultCard(snapshot.data); - } else if (snapshot.hasError) { - throw 'ASYNC ERROR'; - } else { - return Center( - child: CircularProgressIndicator(), - ); - } - }, - ); -} From e7662a1b88e2b0f6f60266d86d2a940fd90a7718 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 16 Jul 2020 22:11:23 +0200 Subject: [PATCH 38/59] Make kanji result scrollable --- lib/components/kanji/kanji__search_page/kanji_search_page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/components/kanji/kanji__search_page/kanji_search_page.dart b/lib/components/kanji/kanji__search_page/kanji_search_page.dart index 5f3b231..2e7cead 100644 --- a/lib/components/kanji/kanji__search_page/kanji_search_page.dart +++ b/lib/components/kanji/kanji__search_page/kanji_search_page.dart @@ -17,7 +17,7 @@ class KanjiResultCard extends StatelessWidget { @override Widget build(BuildContext context) { - return Column( + return ListView( children: [ Container( margin: EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 30.0), From 99256f6b3ca7e609c4a7336c6397a4c7f74df182 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 16 Jul 2020 22:11:55 +0200 Subject: [PATCH 39/59] Style kanji meaning --- .../kanji/kanji__search_page/meaning.dart | 72 ++++++++++++++++--- 1 file changed, 62 insertions(+), 10 deletions(-) diff --git a/lib/components/kanji/kanji__search_page/meaning.dart b/lib/components/kanji/kanji__search_page/meaning.dart index 4730a42..daa9d8e 100644 --- a/lib/components/kanji/kanji__search_page/meaning.dart +++ b/lib/components/kanji/kanji__search_page/meaning.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; class Meaning extends StatelessWidget { - String _meaning; + List _meanings; + List<_MeaningCard> _meaningCards; + bool _expandable; @override Widget build(BuildContext context) { @@ -11,18 +13,68 @@ class Meaning extends StatelessWidget { vertical: 5.0, ), alignment: Alignment.centerLeft, - child: Wrap( + child: _MeaningWrapper(context), + ); + } + + Widget _MeaningWrapper(BuildContext context) { + if (_expandable) { + return ExpansionTile( + initiallyExpanded: false, + title: Center(child: _MeaningCard('Meanings')), + children: [ + SizedBox( + height: 20.0, + ), + Wrap( + runSpacing: 10.0, + children: _meaningCards, + ), + SizedBox( + height: 25.0, + ), + ], + ); + } else { + return Wrap( runSpacing: 10.0, - children: _meaning - .split(',') - .map((meaning) => Container( - margin: EdgeInsets.symmetric(horizontal: 10.0), - child: Text(meaning), - )) - .toList(), + children: _meaningCards, + ); + } + } + + Meaning(_meaning) { + this._meanings = _meaning.split(', '); + this._meaningCards = + _meanings.map((meaning) => _MeaningCard(meaning)).toList(); + this._expandable = (this._meanings.length > 6); + } +} + +class _MeaningCard extends StatelessWidget { + final String _meaning; + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 10.0), + padding: EdgeInsets.symmetric( + horizontal: 10.0, + vertical: 10.0, + ), + child: Text( + _meaning, + style: TextStyle( + fontSize: 20.0, + color: Colors.white, + ), + ), + decoration: BoxDecoration( + color: Colors.grey, + borderRadius: BorderRadius.circular(10.0), ), ); } - Meaning(this._meaning); + _MeaningCard(this._meaning); } From 95927ace4dd9449ba6a0f5dcb42bde60e04b13c4 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 16 Jul 2020 22:49:07 +0200 Subject: [PATCH 40/59] Wrap yomi on large amount --- .../kanji/kanji__search_page/kunyomi.dart | 84 +++++++++++++------ .../kanji/kanji__search_page/onyomi.dart | 84 +++++++++++++------ 2 files changed, 120 insertions(+), 48 deletions(-) diff --git a/lib/components/kanji/kanji__search_page/kunyomi.dart b/lib/components/kanji/kanji__search_page/kunyomi.dart index 09164d3..2168303 100644 --- a/lib/components/kanji/kanji__search_page/kunyomi.dart +++ b/lib/components/kanji/kanji__search_page/kunyomi.dart @@ -2,6 +2,13 @@ import 'package:flutter/material.dart'; class Kunyomi extends StatelessWidget { final List _kunyomi; + List<_KunyomiCard> _kunyomiCards; + bool _expandable; + + Kunyomi(this._kunyomi) { + _kunyomiCards = _kunyomi.map((kunyomi) => _KunyomiCard(kunyomi)).toList(); + _expandable = (_kunyomi.length > 6); + } @override Widget build(BuildContext context) { @@ -11,31 +18,60 @@ class Kunyomi extends StatelessWidget { vertical: 5.0, ), alignment: Alignment.centerLeft, - child: Wrap( - runSpacing: 10.0, - children: _kunyomi.map((onyomi) { - return Container( - margin: EdgeInsets.symmetric(horizontal: 10.0), - padding: EdgeInsets.symmetric( - vertical: 10.0, - horizontal: 10.0, - ), - child: Text( - onyomi, - style: TextStyle( - fontSize: 20.0, - color: Colors.white, - ), - ), - decoration: BoxDecoration( - color: Colors.lightBlue, - borderRadius: BorderRadius.circular(10.0), - ), - ); - }).toList(), - ), + child: _KunyomiWrapper(context), ); } - Kunyomi(this._kunyomi); + Widget _KunyomiWrapper(BuildContext context) { + if (_expandable) { + return ExpansionTile( + initiallyExpanded: false, + title: Center(child: _KunyomiCard('Kunyomi')), + children: [ + SizedBox( + height: 20.0, + ), + Wrap( + runSpacing: 10.0, + children: _kunyomiCards, + ), + SizedBox( + height: 25.0, + ), + ], + ); + } else { + return Wrap( + runSpacing: 10.0, + children: _kunyomiCards, + ); + } + } +} + +class _KunyomiCard extends StatelessWidget { + final String _kunyomi; + const _KunyomiCard(this._kunyomi); + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 10.0), + padding: EdgeInsets.symmetric( + vertical: 10.0, + horizontal: 10.0, + ), + child: Text( + _kunyomi, + style: TextStyle( + fontSize: 20.0, + color: Colors.white, + ), + ), + decoration: BoxDecoration( + color: Colors.lightBlue, + borderRadius: BorderRadius.circular(10.0), + ), + ); + } } diff --git a/lib/components/kanji/kanji__search_page/onyomi.dart b/lib/components/kanji/kanji__search_page/onyomi.dart index 3d8cc9b..3d76434 100644 --- a/lib/components/kanji/kanji__search_page/onyomi.dart +++ b/lib/components/kanji/kanji__search_page/onyomi.dart @@ -2,6 +2,13 @@ import 'package:flutter/material.dart'; class Onyomi extends StatelessWidget { final List _onyomi; + List<_OnyomiCard> _onyomiCards; + bool _expandable; + + Onyomi(this._onyomi) { + _onyomiCards = _onyomi.map((onyomi) => _OnyomiCard(onyomi)).toList(); + _expandable = (_onyomi.length > 6); + } @override Widget build(BuildContext context) { @@ -11,31 +18,60 @@ class Onyomi extends StatelessWidget { vertical: 5.0, ), alignment: Alignment.centerLeft, - child: Wrap( - runSpacing: 10.0, - children: _onyomi.map((onyomi) { - return Container( - margin: EdgeInsets.symmetric(horizontal: 10.0), - padding: EdgeInsets.symmetric( - vertical: 10.0, - horizontal: 10.0, - ), - child: Text( - onyomi, - style: TextStyle( - fontSize: 20.0, - color: Colors.white, - ), - ), - decoration: BoxDecoration( - color: Colors.orange, - borderRadius: BorderRadius.circular(10.0), - ), - ); - }).toList(), - ), + child: _OnyomiWrapper(context), ); } - Onyomi(this._onyomi); + Widget _OnyomiWrapper(BuildContext context) { + if (_expandable) { + return ExpansionTile( + initiallyExpanded: false, + title: Center(child: _OnyomiCard('Onyomi')), + children: [ + SizedBox( + height: 20.0, + ), + Wrap( + runSpacing: 10.0, + children: _onyomiCards, + ), + SizedBox( + height: 25.0, + ), + ], + ); + } else { + return Wrap( + runSpacing: 10.0, + children: _onyomiCards, + ); + } + } +} + +class _OnyomiCard extends StatelessWidget { + final String _onyomi; + const _OnyomiCard(this._onyomi); + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 10.0), + padding: EdgeInsets.symmetric( + vertical: 10.0, + horizontal: 10.0, + ), + child: Text( + _onyomi, + style: TextStyle( + fontSize: 20.0, + color: Colors.white, + ), + ), + decoration: BoxDecoration( + color: Colors.orange, + borderRadius: BorderRadius.circular(10.0), + ), + ); + } } From d0ba5b9e88d11d1ad5f18f3d87db73a2bb40ae46 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Thu, 16 Jul 2020 22:49:16 +0200 Subject: [PATCH 41/59] Remove redundant file --- lib/components/kanji/kanji__search_page/yomi_card.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 lib/components/kanji/kanji__search_page/yomi_card.dart diff --git a/lib/components/kanji/kanji__search_page/yomi_card.dart b/lib/components/kanji/kanji__search_page/yomi_card.dart deleted file mode 100644 index e69de29..0000000 From 2f63c202fc1c48a79692fe8aaaa01daf713e7f02 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Mon, 20 Jul 2020 15:41:48 +0200 Subject: [PATCH 42/59] Squashed commit of the following: commit 17db40663d761fc989803469620e3af5ae62f674 Author: h7x4 Date: Sun Jul 19 23:27:31 2020 +0200 Style examples commit 298add43b7d00961de7524560cd37c704c26b885 Author: h7x4abk3g Date: Sat Jul 18 18:49:40 2020 +0200 Add examples --- .../kanji/kanji__search_page/examples.dart | 126 ++++++++++++++++++ .../kanji__search_page/kanji_search_page.dart | 2 + 2 files changed, 128 insertions(+) create mode 100644 lib/components/kanji/kanji__search_page/examples.dart diff --git a/lib/components/kanji/kanji__search_page/examples.dart b/lib/components/kanji/kanji__search_page/examples.dart new file mode 100644 index 0000000..f90911a --- /dev/null +++ b/lib/components/kanji/kanji__search_page/examples.dart @@ -0,0 +1,126 @@ +import 'package:flutter/material.dart'; +import 'package:unofficial_jisho_api/api.dart'; + +class Examples extends StatelessWidget { + final List _onyomiExamples; + final List _kunyomiExamples; + + const Examples( + this._onyomiExamples, + this._kunyomiExamples, + ); + + @override + Widget build(BuildContext context) { + return ExpansionTile( + title: Center( + child: Container( + padding: EdgeInsets.symmetric(vertical: 10.0, horizontal: 10.0), + decoration: BoxDecoration( + color: Colors.blue, + borderRadius: BorderRadius.circular(10.0), + ), + child: Text( + 'Examples', + style: TextStyle( + color: Colors.white, + fontSize: 20.0, + ), + ), + ), + ), + children: [ + _onyomiExamples + .map((onyomiExample) => _Example(onyomiExample, _KanaType.onyomi)) + .toList(), + _kunyomiExamples + .map((kunyomiExample) => + _Example(kunyomiExample, _KanaType.kunyomi)) + .toList(), + ].expand((list) => list).toList()); + } +} + +enum _KanaType { kunyomi, onyomi } + +class _Example extends StatelessWidget { + final _KanaType _kanaType; + final YomiExample _yomiExample; + + const _Example(this._yomiExample, this._kanaType); + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric( + vertical: 10.0, + horizontal: 10.0, + ), + decoration: BoxDecoration( + color: Colors.grey, borderRadius: BorderRadius.circular(10.0)), + child: IntrinsicHeight( + child: Row( + children: [ + Container( + padding: EdgeInsets.symmetric( + vertical: 10.0, + horizontal: 10.0, + ), + decoration: BoxDecoration( + color: (_kanaType == _KanaType.kunyomi) + ? Colors.lightBlue + : Colors.orange, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.0), + bottomLeft: Radius.circular(10.0), + ), + ), + child: Column( + children: [ + Container( + child: Text( + _yomiExample.reading, + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + ), + ), + ), + SizedBox( + height: 5.0, + ), + Container( + child: Text( + _yomiExample.example, + style: TextStyle( + color: Colors.white, + fontSize: 20.0, + ), + ), + ), + ], + ), + ), + SizedBox( + width: 15.0, + ), + Expanded( + child: Wrap( + children: [ + Container( + child: Text( + _yomiExample.meaning, + style: TextStyle( + color: Colors.white, + ), + ), + ) + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/components/kanji/kanji__search_page/kanji_search_page.dart b/lib/components/kanji/kanji__search_page/kanji_search_page.dart index 2e7cead..3c054ed 100644 --- a/lib/components/kanji/kanji__search_page/kanji_search_page.dart +++ b/lib/components/kanji/kanji__search_page/kanji_search_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:jisho_study_tool/components/kanji/kanji__search_page/examples.dart'; import 'package:unofficial_jisho_api/api.dart' as jisho; @@ -81,6 +82,7 @@ class KanjiResultCard extends StatelessWidget { ], ), ), + Examples(_result.onyomiExamples, _result.kunyomiExamples), ], ); } From 76d2b090f3e9f88d32644a07a83527db565f62e1 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Tue, 21 Jul 2020 23:29:02 +0200 Subject: [PATCH 43/59] JST 4 - Add kanji search suggestions (#3) * Add division package * Add base logic and widget * Finish layout * Fix kanji regex * Add bloc logic --- lib/bloc/kanji/kanji_bloc.dart | 5 ++ lib/bloc/kanji/kanji_event.dart | 10 ++-- lib/bloc/kanji/kanji_state.dart | 17 ++++--- lib/components/kanji/kanji_suggestions.dart | 55 +++++++++++++++++++++ lib/screens/kanji_search.dart | 4 ++ lib/services/kanji_suggestions.dart | 5 ++ pubspec.lock | 32 ++++++++---- pubspec.yaml | 39 +-------------- 8 files changed, 111 insertions(+), 56 deletions(-) create mode 100644 lib/components/kanji/kanji_suggestions.dart create mode 100644 lib/services/kanji_suggestions.dart diff --git a/lib/bloc/kanji/kanji_bloc.dart b/lib/bloc/kanji/kanji_bloc.dart index 593baf2..a8cfe7d 100644 --- a/lib/bloc/kanji/kanji_bloc.dart +++ b/lib/bloc/kanji/kanji_bloc.dart @@ -5,6 +5,7 @@ import './kanji_state.dart'; import 'package:bloc/bloc.dart'; import 'package:jisho_study_tool/services/kanji_search.dart'; +import 'package:jisho_study_tool/services/kanji_suggestions.dart'; export './kanji_event.dart'; export './kanji_state.dart'; @@ -28,6 +29,10 @@ class KanjiBloc extends Bloc { } on Exception { yield KanjiSearchError('Something went wrong'); } + } else if (event is GetKanjiSuggestions) { + + final suggestions = kanjiSuggestions(event.searchString); + yield KanjiSearchInput(suggestions); } else if (event is ReturnToInitialState) { yield KanjiSearchInitial(); diff --git a/lib/bloc/kanji/kanji_event.dart b/lib/bloc/kanji/kanji_event.dart index 6bbe8e5..7bb79b8 100644 --- a/lib/bloc/kanji/kanji_event.dart +++ b/lib/bloc/kanji/kanji_event.dart @@ -2,12 +2,16 @@ abstract class KanjiEvent { const KanjiEvent(); } +class GetKanjiSuggestions extends KanjiEvent { + final String searchString; + const GetKanjiSuggestions(this.searchString); +} + class GetKanji extends KanjiEvent { final String kanjiSearchString; - - GetKanji(this.kanjiSearchString); + const GetKanji(this.kanjiSearchString); } class ReturnToInitialState extends KanjiEvent { - ReturnToInitialState(); + const ReturnToInitialState(); } \ No newline at end of file diff --git a/lib/bloc/kanji/kanji_state.dart b/lib/bloc/kanji/kanji_state.dart index 7e5aff2..ad835db 100644 --- a/lib/bloc/kanji/kanji_state.dart +++ b/lib/bloc/kanji/kanji_state.dart @@ -5,18 +5,23 @@ abstract class KanjiState { } class KanjiSearchInitial extends KanjiState { - KanjiSearchInitial(); + const KanjiSearchInitial(); +} + +class KanjiSearchInput extends KanjiState { + final List kanjiSuggestions; + const KanjiSearchInput(this.kanjiSuggestions); } class KanjiSearchLoading extends KanjiState { - KanjiSearchLoading(); + const KanjiSearchLoading(); } class KanjiSearchFinished extends KanjiState { final KanjiResult kanji; final bool starred; - KanjiSearchFinished({ + const KanjiSearchFinished({ this.kanji, this.starred = false, }); @@ -25,7 +30,5 @@ class KanjiSearchFinished extends KanjiState { class KanjiSearchError extends KanjiState { final String message; - KanjiSearchError(this.message); -} - -class ReKanjiSearch extends KanjiState {} + const KanjiSearchError(this.message); +} \ No newline at end of file diff --git a/lib/components/kanji/kanji_suggestions.dart b/lib/components/kanji/kanji_suggestions.dart new file mode 100644 index 0000000..3c0a044 --- /dev/null +++ b/lib/components/kanji/kanji_suggestions.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:jisho_study_tool/bloc/kanji/kanji_bloc.dart'; + +class KanjiSuggestions extends StatelessWidget { + final List _suggestions; + const KanjiSuggestions(this._suggestions); + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.grey[300], + padding: EdgeInsets.symmetric( + vertical: 20.0, + horizontal: 40.0, + ), + child: GridView.count( + crossAxisCount: 3, + mainAxisSpacing: 20.0, + crossAxisSpacing: 40.0, + children: _suggestions.map((kanji) => _Suggestion(kanji)).toList(), + ), + ); + } +} + +class _Suggestion extends StatelessWidget { + final String _kanji; + const _Suggestion(this._kanji); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + FocusScope.of(context).unfocus(); //Puts away the keyboard + BlocProvider.of(context).add(GetKanji(_kanji)); + }, + child: Container( + decoration: BoxDecoration( + color: Colors.grey, + borderRadius: BorderRadius.circular(10.0), + ), + child: Container( + margin: EdgeInsets.all(10.0), + child: FittedBox( + child: Text( + _kanji, + style: TextStyle(color: Colors.white), + ), + ), + ), + ), + ); + } +} diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index 03f9100..2a0fc7d 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:jisho_study_tool/bloc/kanji/kanji_bloc.dart'; import 'package:jisho_study_tool/components/kanji/kanji__search_page/kanji_search_page.dart'; +import 'package:jisho_study_tool/components/kanji/kanji_suggestions.dart'; import 'package:jisho_study_tool/components/loading.dart'; class KanjiView extends StatelessWidget { @@ -12,6 +13,8 @@ class KanjiView extends StatelessWidget { builder: (context, state) { if (state is KanjiSearchInitial) return Container(); + else if (state is KanjiSearchInput) + return KanjiSuggestions(state.kanjiSuggestions); else if (state is KanjiSearchLoading) return LoadingScreen(); else if (state is KanjiSearchFinished) @@ -42,6 +45,7 @@ class KanjiViewBar extends StatelessWidget { child: Container( padding: EdgeInsets.symmetric(vertical: 10.0), child: TextField( + onChanged: (text) => BlocProvider.of(context).add(GetKanjiSuggestions(text)), onSubmitted: (text) => BlocProvider.of(context).add(GetKanji(text)), decoration: new InputDecoration( diff --git a/lib/services/kanji_suggestions.dart b/lib/services/kanji_suggestions.dart new file mode 100644 index 0000000..a2adfc2 --- /dev/null +++ b/lib/services/kanji_suggestions.dart @@ -0,0 +1,5 @@ +final kanjiPattern = RegExp(r'[\u3400-\u4DB5\u4E00-\u9FCB\uF900-\uFA6A]'); + +List kanjiSuggestions(String string) { + return kanjiPattern.allMatches(string).map((match) => match.group(0)).toList(); +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 84e8413..c88cf25 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,7 +7,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.4.1" + version: "2.4.2" bloc: dependency: transitive description: @@ -22,6 +22,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0-nullsafety" charcode: dependency: transitive description: @@ -42,7 +49,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.12" + version: "1.15.0-nullsafety" csslib: dependency: transitive description: @@ -57,6 +64,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.2" + division: + dependency: "direct main" + description: + name: division + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.8" fake_async: dependency: transitive description: @@ -127,14 +141,14 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.6" + version: "0.12.9" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.1.8" + version: "1.3.0-nullsafety" nested: dependency: transitive description: @@ -202,7 +216,7 @@ packages: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.9.3" + version: "1.9.5" stream_channel: dependency: transitive description: @@ -230,14 +244,14 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.16" + version: "0.2.18" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.1.6" + version: "1.3.0-nullsafety" unofficial_jisho_api: dependency: "direct main" description: @@ -286,7 +300,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.1.0-nullsafety" sdks: - dart: ">=2.7.0 <3.0.0" + dart: ">=2.9.0-18.0 <2.9.0" flutter: ">=1.16.0 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 7b108ef..7129eb3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,16 +1,5 @@ name: jisho_study_tool description: A new Flutter project. - -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# 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.0+1 environment: @@ -20,45 +9,24 @@ dependencies: flutter: sdk: flutter - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. # cupertino_icons: ^0.1.2 unofficial_jisho_api: ^1.1.0 flutter_bloc: ^5.0.1 url_launcher: ^5.5.0 + division: ^0.8.8 dev_dependencies: flutter_test: sdk: flutter - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter. flutter: - - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. uses-material-design: true - - # To add assets to your application, add an assets section, like this: + # assets: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware. - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/assets-and-images/#from-packages - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: # fonts: # - family: Schyler # fonts: @@ -70,6 +38,3 @@ flutter: # - asset: fonts/TrajanPro.ttf # - asset: fonts/TrajanPro_Bold.ttf # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/custom-fonts/#from-packages From 689983b84826a27d89d56b850c839aade469a060 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Wed, 22 Jul 2020 14:13:53 +0200 Subject: [PATCH 44/59] Placed keyboard logic inside bloc listener --- lib/components/kanji/kanji_suggestions.dart | 1 - lib/screens/kanji_search.dart | 67 +++++++++++++-------- 2 files changed, 41 insertions(+), 27 deletions(-) diff --git a/lib/components/kanji/kanji_suggestions.dart b/lib/components/kanji/kanji_suggestions.dart index 3c0a044..ade96cb 100644 --- a/lib/components/kanji/kanji_suggestions.dart +++ b/lib/components/kanji/kanji_suggestions.dart @@ -32,7 +32,6 @@ class _Suggestion extends StatelessWidget { Widget build(BuildContext context) { return InkWell( onTap: () { - FocusScope.of(context).unfocus(); //Puts away the keyboard BlocProvider.of(context).add(GetKanji(_kanji)); }, child: Container( diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index 2a0fc7d..557d071 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -9,23 +9,33 @@ import 'package:jisho_study_tool/components/loading.dart'; class KanjiView extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is KanjiSearchInitial) - return Container(); - else if (state is KanjiSearchInput) - return KanjiSuggestions(state.kanjiSuggestions); - else if (state is KanjiSearchLoading) - return LoadingScreen(); - else if (state is KanjiSearchFinished) - return WillPopScope( - child: KanjiResultCard(state.kanji), - onWillPop: () async { - BlocProvider.of(context).add(ReturnToInitialState()); - return false; - }); - throw 'No such event found'; + return BlocListener( + listener: (context, state) { + if (state is KanjiSearchInitial) { + FocusScope.of(context).unfocus(); + } else if (state is KanjiSearchLoading) { + FocusScope.of(context).unfocus(); + } }, + child: BlocBuilder( + builder: (context, state) { + if (state is KanjiSearchInitial) { + return Container(); + } else if (state is KanjiSearchInput) + return KanjiSuggestions(state.kanjiSuggestions); + else if (state is KanjiSearchLoading) + return LoadingScreen(); + else if (state is KanjiSearchFinished) + return WillPopScope( + child: KanjiResultCard(state.kanji), + onWillPop: () async { + BlocProvider.of(context) + .add(ReturnToInitialState()); + return false; + }); + throw 'No such event found'; + }, + ), ); } } @@ -38,23 +48,28 @@ class KanjiViewBar extends StatelessWidget { children: [ IconButton( icon: Icon(Icons.arrow_back), - onPressed: () => BlocProvider.of(context) - .add(ReturnToInitialState()), + onPressed: () => + BlocProvider.of(context).add(ReturnToInitialState()), ), Expanded( child: Container( - padding: EdgeInsets.symmetric(vertical: 10.0), child: TextField( - onChanged: (text) => BlocProvider.of(context).add(GetKanjiSuggestions(text)), + onChanged: (text) => BlocProvider.of(context) + .add(GetKanjiSuggestions(text)), onSubmitted: (text) => BlocProvider.of(context).add(GetKanji(text)), decoration: new InputDecoration( - prefixIcon: Icon(Icons.search), - hintText: 'Search for kanji', - fillColor: Colors.white, - filled: true, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(100.0)), + prefixIcon: Icon(Icons.search), + hintText: 'Search for kanji', + fillColor: Colors.white, + filled: true, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(100.0), + ), + contentPadding: EdgeInsets.symmetric(vertical: 10.0), + isDense: false), + style: TextStyle( + fontSize: 14.0, ), ), ), From ccd38eac2ab09627db60670a850178a45fbc4bb7 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Wed, 22 Jul 2020 15:22:21 +0200 Subject: [PATCH 45/59] Separate text field logic --- lib/screens/kanji_search.dart | 79 ++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 19 deletions(-) diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index 557d071..250b128 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -53,25 +53,7 @@ class KanjiViewBar extends StatelessWidget { ), Expanded( child: Container( - child: TextField( - onChanged: (text) => BlocProvider.of(context) - .add(GetKanjiSuggestions(text)), - onSubmitted: (text) => - BlocProvider.of(context).add(GetKanji(text)), - decoration: new InputDecoration( - prefixIcon: Icon(Icons.search), - hintText: 'Search for kanji', - fillColor: Colors.white, - filled: true, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(100.0), - ), - contentPadding: EdgeInsets.symmetric(vertical: 10.0), - isDense: false), - style: TextStyle( - fontSize: 14.0, - ), - ), + child: _KanjiTextField(), ), ), IconButton( @@ -87,3 +69,62 @@ class KanjiViewBar extends StatelessWidget { ); } } + +class _KanjiTextField extends StatefulWidget { + @override + _KanjiTextFieldState createState() => new _KanjiTextFieldState(); +} + +class _KanjiTextFieldState extends State<_KanjiTextField> { + FocusNode _focus = new FocusNode(); + TextEditingController _textController = new TextEditingController(); + + @override + void initState() { + super.initState(); + _focus.addListener(_onFocusChange); + } + + void _onFocusChange() { + debugPrint('TextField Focus Changed: ${_focus.hasFocus.toString()}'); + if (_focus.hasFocus) _getKanjiSuggestions(_textController.text); + else FocusScope.of(context).unfocus(); + } + + void _getKanjiSuggestions(String text) => + BlocProvider.of(context).add(GetKanjiSuggestions(text)); + + void _clearText() { + _textController.text = ''; + _getKanjiSuggestions(_textController.text); + } + + @override + Widget build(BuildContext context) { + return TextField( + focusNode: _focus, + controller: _textController, + onChanged: (text) => _getKanjiSuggestions(text), + onSubmitted: (text) => + BlocProvider.of(context).add(GetKanji(text)), + decoration: new InputDecoration( + prefixIcon: Icon(Icons.search), + hintText: 'Search for kanji', + fillColor: Colors.white, + filled: true, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(100.0), + ), + contentPadding: EdgeInsets.symmetric(vertical: 10.0), + isDense: false, + suffixIcon: IconButton( + icon: Icon(Icons.clear), + onPressed: () => _clearText(), + ) + ), + style: TextStyle( + fontSize: 14.0, + ), + ); + } +} From 50812c93ab76ffede54c7e060b2bf99c652675e1 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Wed, 22 Jul 2020 16:24:00 +0200 Subject: [PATCH 46/59] Add paste button --- lib/screens/kanji_search.dart | 48 +++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index 250b128..9ed202f 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:jisho_study_tool/bloc/kanji/kanji_bloc.dart'; @@ -75,9 +76,12 @@ class _KanjiTextField extends StatefulWidget { _KanjiTextFieldState createState() => new _KanjiTextFieldState(); } +enum TextFieldButton {clear, paste} + class _KanjiTextFieldState extends State<_KanjiTextField> { FocusNode _focus = new FocusNode(); TextEditingController _textController = new TextEditingController(); + TextFieldButton _button = TextFieldButton.paste; @override void initState() { @@ -85,22 +89,47 @@ class _KanjiTextFieldState extends State<_KanjiTextField> { _focus.addListener(_onFocusChange); } - void _onFocusChange() { - debugPrint('TextField Focus Changed: ${_focus.hasFocus.toString()}'); - if (_focus.hasFocus) _getKanjiSuggestions(_textController.text); - else FocusScope.of(context).unfocus(); - } - void _getKanjiSuggestions(String text) => BlocProvider.of(context).add(GetKanjiSuggestions(text)); + void updateSuggestions() => _getKanjiSuggestions(_textController.text); + + void _onFocusChange() { + debugPrint('TextField Focus Changed: ${_focus.hasFocus.toString()}'); + + setState(() { + _button = _focus.hasFocus ? TextFieldButton.clear : TextFieldButton.paste; + }); + + if (_focus.hasFocus) + updateSuggestions(); + else + FocusScope.of(context).unfocus(); + } + void _clearText() { _textController.text = ''; - _getKanjiSuggestions(_textController.text); + updateSuggestions(); + } + + void _pasteText() async { + ClipboardData clipboardData = await Clipboard.getData('text/plain'); + _textController.text = clipboardData.text; + updateSuggestions(); } @override Widget build(BuildContext context) { + IconButton _clearButton = IconButton( + icon: Icon(Icons.clear), + onPressed: () => _clearText(), + ); + + IconButton _pasteButton = IconButton( + icon: Icon(Icons.content_paste), + onPressed: () => _pasteText(), + ); + return TextField( focusNode: _focus, controller: _textController, @@ -117,10 +146,7 @@ class _KanjiTextFieldState extends State<_KanjiTextField> { ), contentPadding: EdgeInsets.symmetric(vertical: 10.0), isDense: false, - suffixIcon: IconButton( - icon: Icon(Icons.clear), - onPressed: () => _clearText(), - ) + suffixIcon: (_button == TextFieldButton.clear) ? _clearButton : _pasteButton, ), style: TextStyle( fontSize: 14.0, From b00ad311416ca82e6ea714a062026d6cd3e9719c Mon Sep 17 00:00:00 2001 From: h7x4 Date: Sat, 25 Jul 2020 14:55:49 +0200 Subject: [PATCH 47/59] Remove pubspec.lock --- .gitignore | 2 + pubspec.lock | 292 --------------------------------------------------- 2 files changed, 2 insertions(+), 292 deletions(-) delete mode 100644 pubspec.lock diff --git a/.gitignore b/.gitignore index ae1f183..ec2d65d 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,5 @@ lib/generated_plugin_registrant.dart # Exceptions to above rules. !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages + +pubspec.lock \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock deleted file mode 100644 index 84e8413..0000000 --- a/pubspec.lock +++ /dev/null @@ -1,292 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.4.1" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "5.0.1" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.14.12" - csslib: - dependency: transitive - description: - name: csslib - url: "https://pub.dartlang.org" - source: hosted - version: "0.16.1" - cubit: - dependency: transitive - description: - name: cubit - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.2" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "5.0.1" - flutter_cubit: - dependency: transitive - description: - name: flutter_cubit - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.1" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - html: - dependency: transitive - description: - name: html - url: "https://pub.dartlang.org" - source: hosted - version: "0.14.0+3" - html_unescape: - dependency: transitive - description: - name: html_unescape - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1+3" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.4" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.6" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.8" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "0.0.4" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0+1" - platform_detect: - dependency: transitive - description: - name: platform_detect - url: "https://pub.dartlang.org" - source: hosted - version: "1.4.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "4.3.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "1.4.4" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.3" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.5" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.16" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.6" - unofficial_jisho_api: - dependency: "direct main" - description: - name: unofficial_jisho_api - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - url_launcher: - dependency: "direct main" - description: - name: url_launcher - url: "https://pub.dartlang.org" - source: hosted - version: "5.5.0" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - url: "https://pub.dartlang.org" - source: hosted - version: "0.0.1+1" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - url: "https://pub.dartlang.org" - source: hosted - version: "0.0.1+7" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.7" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.2" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" -sdks: - dart: ">=2.7.0 <3.0.0" - flutter: ">=1.16.0 <2.0.0" From 3d0cef86ca1c5c0f843019f80a1b5ed488c78dad Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Mon, 17 Aug 2020 11:15:32 +0200 Subject: [PATCH 48/59] Misc --- lib/bloc/search/search_bloc.dart | 2 ++ lib/bloc/search/search_state.dart | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/bloc/search/search_bloc.dart b/lib/bloc/search/search_bloc.dart index 1cd2b14..966d290 100644 --- a/lib/bloc/search/search_bloc.dart +++ b/lib/bloc/search/search_bloc.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:meta/meta.dart'; part 'search_event.dart'; diff --git a/lib/bloc/search/search_state.dart b/lib/bloc/search/search_state.dart index 87f3d6a..8e79f14 100644 --- a/lib/bloc/search/search_state.dart +++ b/lib/bloc/search/search_state.dart @@ -9,6 +9,4 @@ class SearchLoading extends SearchState {} class SearchFinished extends SearchState {} -class SearchError extends SearchState {} - -class ReSearch extends SearchState {} \ No newline at end of file +class SearchError extends SearchState {} \ No newline at end of file From 879bbf05810fbf0586c8e4c7321ea3caa0fa60c4 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Mon, 17 Aug 2020 21:54:34 +0200 Subject: [PATCH 49/59] Update bloc --- pubspec.lock | 20 +++----------------- pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index c88cf25..781bbba 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -14,7 +14,7 @@ packages: name: bloc url: "https://pub.dartlang.org" source: hosted - version: "5.0.1" + version: "6.0.2" boolean_selector: dependency: transitive description: @@ -57,13 +57,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.16.1" - cubit: - dependency: transitive - description: - name: cubit - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.2" division: dependency: "direct main" description: @@ -89,14 +82,7 @@ packages: name: flutter_bloc url: "https://pub.dartlang.org" source: hosted - version: "5.0.1" - flutter_cubit: - dependency: transitive - description: - name: flutter_cubit - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.1" + version: "6.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -190,7 +176,7 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "4.3.0" + version: "4.3.2" pub_semver: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 7129eb3..ece49e4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,7 @@ dependencies: # cupertino_icons: ^0.1.2 unofficial_jisho_api: ^1.1.0 - flutter_bloc: ^5.0.1 + flutter_bloc: ^6.0.1 url_launcher: ^5.5.0 division: ^0.8.8 From 738676c4144d2e6e2c3651d9096e5e5dd892c4ed Mon Sep 17 00:00:00 2001 From: h7x4 Date: Tue, 18 Aug 2020 10:52:18 +0200 Subject: [PATCH 50/59] Update bloc --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 7129eb3..5e90f3a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,7 @@ dependencies: # cupertino_icons: ^0.1.2 unofficial_jisho_api: ^1.1.0 - flutter_bloc: ^5.0.1 + flutter_bloc: ^6.0.0 url_launcher: ^5.5.0 division: ^0.8.8 From 42a6f5e412d11b143352bcee616b8a7079ff4c72 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Wed, 19 Aug 2020 16:26:25 +0200 Subject: [PATCH 51/59] Add search bloc --- lib/bloc/search/search_bloc.dart | 16 +++++++++++++++- lib/bloc/search/search_event.dart | 13 ++++++++++++- lib/bloc/search/search_state.dart | 24 +++++++++++++++++++----- lib/services/jisho_search.dart | 5 +++++ 4 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 lib/services/jisho_search.dart diff --git a/lib/bloc/search/search_bloc.dart b/lib/bloc/search/search_bloc.dart index 966d290..12fd1f2 100644 --- a/lib/bloc/search/search_bloc.dart +++ b/lib/bloc/search/search_bloc.dart @@ -5,6 +5,9 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:meta/meta.dart'; +import 'package:jisho_study_tool/services/jisho_search.dart'; +import 'package:unofficial_jisho_api/parser.dart'; + part 'search_event.dart'; part 'search_state.dart'; @@ -15,6 +18,17 @@ class SearchBloc extends Bloc { Stream mapEventToState( SearchEvent event, ) async* { - // TODO: implement mapEventToState + if (event is GetSearchResults) { + yield SearchLoading(); + + try { + final _searchResults = await fetchJishoResults(event.searchString); + yield SearchFinished(_searchResults); + } on Exception { + yield SearchError('Something went wrong'); + } + } else if (event is ReturnToInitialState) { + + } } } diff --git a/lib/bloc/search/search_event.dart b/lib/bloc/search/search_event.dart index 8d89c5f..9b5d3f2 100644 --- a/lib/bloc/search/search_event.dart +++ b/lib/bloc/search/search_event.dart @@ -1,4 +1,15 @@ part of 'search_bloc.dart'; @immutable -abstract class SearchEvent {} +abstract class SearchEvent { + const SearchEvent(); +} + +class GetSearchResults extends SearchEvent { + final String searchString; + const GetSearchResults(this.searchString); +} + +class ReturnToInitialState extends SearchEvent { + const ReturnToInitialState(); +} \ No newline at end of file diff --git a/lib/bloc/search/search_state.dart b/lib/bloc/search/search_state.dart index 8e79f14..cf0ed2c 100644 --- a/lib/bloc/search/search_state.dart +++ b/lib/bloc/search/search_state.dart @@ -1,12 +1,26 @@ part of 'search_bloc.dart'; @immutable -abstract class SearchState {} +abstract class SearchState { + const SearchState(); +} -class SearchInitial extends SearchState {} +class SearchInitial extends SearchState { + const SearchInitial(); +} -class SearchLoading extends SearchState {} +class SearchLoading extends SearchState { + const SearchLoading(); +} -class SearchFinished extends SearchState {} +class SearchFinished extends SearchState { + final JishoAPIResult result; -class SearchError extends SearchState {} \ No newline at end of file + const SearchFinished(this.result); +} + +class SearchError extends SearchState { + final String message; + + const SearchError(this.message); +} \ No newline at end of file diff --git a/lib/services/jisho_search.dart b/lib/services/jisho_search.dart new file mode 100644 index 0000000..eb1e379 --- /dev/null +++ b/lib/services/jisho_search.dart @@ -0,0 +1,5 @@ +import 'package:unofficial_jisho_api/api.dart' as jisho; + +Future fetchJishoResults(searchTerm) async { + return await jisho.searchForPhrase(searchTerm); +} \ No newline at end of file From b5f983d377cdfc71ca78f090c1df67499ce17d66 Mon Sep 17 00:00:00 2001 From: h7x4abk3g Date: Wed, 19 Aug 2020 16:27:00 +0200 Subject: [PATCH 52/59] Add text to search card --- lib/components/search/search_card.dart | 52 +++++++++++++------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/lib/components/search/search_card.dart b/lib/components/search/search_card.dart index 383efc8..6ea8995 100644 --- a/lib/components/search/search_card.dart +++ b/lib/components/search/search_card.dart @@ -4,38 +4,36 @@ import 'package:unofficial_jisho_api/api.dart'; class SearchResultCard extends StatelessWidget { final JishoResult _result; + const SearchResultCard(this._result); @override Widget build(BuildContext context) { - return Row( - children: [ - Expanded( - child: Container( - child: Center( - child: Text(_result.toJson().toString()), - ), - height: 50.0, - margin: EdgeInsets.symmetric( - horizontal: 20.0, - vertical: 20.0, - ), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.0), - color: Colors.white, - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 1, - offset: Offset(2, 2), // changes position of shadow - ) - ]), - ), - ), - ], + return Container( + child: Column( + children: [ + Text(_result.slug), + Text(_result.senses.toString()), + ], + ), + alignment: Alignment.center, + height: 50.0, + margin: EdgeInsets.symmetric( + horizontal: 20.0, + vertical: 20.0, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0), + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 2, + blurRadius: 1, + offset: Offset(2, 2), // changes position of shadow + ) + ]), ); } - SearchResultCard(this._result); } From e50a7128937571b173208767b2cac59256f13feb Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 19 Aug 2020 18:25:45 +0200 Subject: [PATCH 53/59] Implement search bloc to search bar --- lib/bloc/search/search_bloc.dart | 2 +- lib/bloc/search/search_state.dart | 4 ++-- lib/screens/kanji_search.dart | 9 +++------ lib/screens/search.dart | 29 ++++++++++++++++++++++++++++- 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/lib/bloc/search/search_bloc.dart b/lib/bloc/search/search_bloc.dart index 12fd1f2..889fdbf 100644 --- a/lib/bloc/search/search_bloc.dart +++ b/lib/bloc/search/search_bloc.dart @@ -23,7 +23,7 @@ class SearchBloc extends Bloc { try { final _searchResults = await fetchJishoResults(event.searchString); - yield SearchFinished(_searchResults); + if (_searchResults.meta.status == 200) yield SearchFinished(_searchResults.data); } on Exception { yield SearchError('Something went wrong'); } diff --git a/lib/bloc/search/search_state.dart b/lib/bloc/search/search_state.dart index cf0ed2c..4f934ee 100644 --- a/lib/bloc/search/search_state.dart +++ b/lib/bloc/search/search_state.dart @@ -14,9 +14,9 @@ class SearchLoading extends SearchState { } class SearchFinished extends SearchState { - final JishoAPIResult result; + final List results; - const SearchFinished(this.result); + const SearchFinished(this.results); } class SearchError extends SearchState { diff --git a/lib/screens/kanji_search.dart b/lib/screens/kanji_search.dart index 9ed202f..617423b 100644 --- a/lib/screens/kanji_search.dart +++ b/lib/screens/kanji_search.dart @@ -20,12 +20,9 @@ class KanjiView extends StatelessWidget { }, child: BlocBuilder( builder: (context, state) { - if (state is KanjiSearchInitial) { - return Container(); - } else if (state is KanjiSearchInput) - return KanjiSuggestions(state.kanjiSuggestions); - else if (state is KanjiSearchLoading) - return LoadingScreen(); + if (state is KanjiSearchInitial) return Container(); + else if (state is KanjiSearchInput) return KanjiSuggestions(state.kanjiSuggestions); + else if (state is KanjiSearchLoading) return LoadingScreen(); else if (state is KanjiSearchFinished) return WillPopScope( child: KanjiResultCard(state.kanji), diff --git a/lib/screens/search.dart b/lib/screens/search.dart index a28cc49..a38e5c9 100644 --- a/lib/screens/search.dart +++ b/lib/screens/search.dart @@ -1,13 +1,39 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:jisho_study_tool/bloc/search/search_bloc.dart'; +import 'package:jisho_study_tool/components/loading.dart'; +import 'package:jisho_study_tool/components/search/search_card.dart'; class SearchView extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BlocListener( + listener: (context, state) { + }, + child: BlocBuilder( + builder: (context, state) { + if (state is SearchInitial) return _InitialView(); + else if (state is SearchLoading) return LoadingScreen(); + else if (state is SearchFinished) { + return ListView( + children: state.results.map((result) => SearchResultCard(result)).toList(), + ); + } + }, + ) + ); + } +} + +class _InitialView extends StatelessWidget { + @override Widget build(BuildContext context) { return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ SearchBar(), - ], + ] ); } } @@ -44,6 +70,7 @@ class SearchBar extends StatelessWidget { child: Column( children: [ TextField( + onSubmitted: (text) => BlocProvider.of(context).add(GetSearchResults(text)), controller: TextEditingController(), decoration: InputDecoration( labelText: 'Search', From 5681b9708c355826eb51aa8143ab982c77eaf480 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Sun, 23 Aug 2020 00:06:09 +0200 Subject: [PATCH 54/59] Update search to use expansiontiles --- lib/components/search/search_card.dart | 93 +++++++++++++++++++------- 1 file changed, 68 insertions(+), 25 deletions(-) diff --git a/lib/components/search/search_card.dart b/lib/components/search/search_card.dart index 6ea8995..6574ce4 100644 --- a/lib/components/search/search_card.dart +++ b/lib/components/search/search_card.dart @@ -4,36 +4,79 @@ import 'package:unofficial_jisho_api/api.dart'; class SearchResultCard extends StatelessWidget { final JishoResult _result; - const SearchResultCard(this._result); + JishoJapaneseWord _mainWord; + List _otherForms; + + SearchResultCard(this._result) { + this._mainWord = _result.japanese[0]; + this._otherForms = _result.japanese.sublist(1); + } + + @override + Widget build(BuildContext context) { + return ExpansionTile( + title: _JapaneseHeader(_mainWord), + children: [_OtherForms(_otherForms)], + ); + } +} + +class _JapaneseHeader extends StatelessWidget { + final JishoJapaneseWord _word; + const _JapaneseHeader(this._word); @override Widget build(BuildContext context) { return Container( - child: Column( - children: [ - Text(_result.slug), - Text(_result.senses.toString()), - ], - ), - alignment: Alignment.center, - height: 50.0, - margin: EdgeInsets.symmetric( - horizontal: 20.0, - vertical: 20.0, - ), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.0), - color: Colors.white, - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 1, - offset: Offset(2, 2), // changes position of shadow - ) - ]), + child: _KanaBox(_word), ); } - } +class _OtherForms extends StatelessWidget { + final List _otherForms; + _OtherForms(this._otherForms); + + @override + Widget build(BuildContext context) { + return Container( + child: Row( + children: _otherForms.map((form) => _KanaBox(form)).toList(), + )); + } +} + +class _KanaBox extends StatelessWidget { + final JishoJapaneseWord _word; + const _KanaBox(this._word); + + @override + Widget build(BuildContext context) { + final hasFurigana = (_word.word != null); + + return Container( + child: Column( + children: [ + (hasFurigana) ? Text(_word.reading) : Text(''), + (hasFurigana) ? Text(_word.word) : Text(_word.reading), + ], + ), + margin: EdgeInsets.symmetric( + horizontal: 5.0, + vertical: 5.0, + ), + padding: EdgeInsets.all(5.0), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 1, + blurRadius: 0.5, + offset: Offset(1, 1), + ), + ], + ), + ); + } +} From c4e5fdd9ff63513a9b46041aa455a2b2e1005ac7 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Sun, 23 Aug 2020 00:38:42 +0200 Subject: [PATCH 55/59] Modularize search_card parts --- lib/components/search/parts/header.dart | 21 +++++++ lib/components/search/parts/other_forms.dart | 50 +++++++++++++++ lib/components/search/search_card.dart | 66 ++------------------ 3 files changed, 76 insertions(+), 61 deletions(-) create mode 100644 lib/components/search/parts/header.dart create mode 100644 lib/components/search/parts/other_forms.dart diff --git a/lib/components/search/parts/header.dart b/lib/components/search/parts/header.dart new file mode 100644 index 0000000..8849aff --- /dev/null +++ b/lib/components/search/parts/header.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; +import 'package:unofficial_jisho_api/api.dart'; + +class JapaneseHeader extends StatelessWidget { + final JishoJapaneseWord _word; + const JapaneseHeader(this._word); + + @override + Widget build(BuildContext context) { + final hasFurigana = (_word.word != null); + + return Container( + child: Column( + children: [ + (hasFurigana) ? Text(_word.reading) : Text(''), + (hasFurigana) ? Text(_word.word) : Text(_word.reading), + ], + ), + ); + } +} diff --git a/lib/components/search/parts/other_forms.dart b/lib/components/search/parts/other_forms.dart new file mode 100644 index 0000000..e26558f --- /dev/null +++ b/lib/components/search/parts/other_forms.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:unofficial_jisho_api/api.dart'; + +class OtherForms extends StatelessWidget { + final List _otherForms; + OtherForms(this._otherForms); + + @override + Widget build(BuildContext context) { + return Container( + child: Row( + children: _otherForms.map((form) => _KanaBox(form)).toList(), + )); + } +} + +class _KanaBox extends StatelessWidget { + final JishoJapaneseWord _word; + const _KanaBox(this._word); + + @override + Widget build(BuildContext context) { + final hasFurigana = (_word.word != null); + + return Container( + child: Column( + children: [ + (hasFurigana) ? Text(_word.reading) : Text(''), + (hasFurigana) ? Text(_word.word) : Text(_word.reading), + ], + ), + margin: EdgeInsets.symmetric( + horizontal: 5.0, + vertical: 5.0, + ), + padding: EdgeInsets.all(5.0), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 1, + blurRadius: 0.5, + offset: Offset(1, 1), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/components/search/search_card.dart b/lib/components/search/search_card.dart index 6574ce4..6d445f1 100644 --- a/lib/components/search/search_card.dart +++ b/lib/components/search/search_card.dart @@ -2,6 +2,9 @@ import 'package:flutter/material.dart'; import 'package:unofficial_jisho_api/api.dart'; +import 'parts/header.dart'; +import 'parts/other_forms.dart'; + class SearchResultCard extends StatelessWidget { final JishoResult _result; JishoJapaneseWord _mainWord; @@ -15,68 +18,9 @@ class SearchResultCard extends StatelessWidget { @override Widget build(BuildContext context) { return ExpansionTile( - title: _JapaneseHeader(_mainWord), - children: [_OtherForms(_otherForms)], + title: JapaneseHeader(_mainWord), + children: [OtherForms(_otherForms)], ); } } -class _JapaneseHeader extends StatelessWidget { - final JishoJapaneseWord _word; - const _JapaneseHeader(this._word); - - @override - Widget build(BuildContext context) { - return Container( - child: _KanaBox(_word), - ); - } -} - -class _OtherForms extends StatelessWidget { - final List _otherForms; - _OtherForms(this._otherForms); - - @override - Widget build(BuildContext context) { - return Container( - child: Row( - children: _otherForms.map((form) => _KanaBox(form)).toList(), - )); - } -} - -class _KanaBox extends StatelessWidget { - final JishoJapaneseWord _word; - const _KanaBox(this._word); - - @override - Widget build(BuildContext context) { - final hasFurigana = (_word.word != null); - - return Container( - child: Column( - children: [ - (hasFurigana) ? Text(_word.reading) : Text(''), - (hasFurigana) ? Text(_word.word) : Text(_word.reading), - ], - ), - margin: EdgeInsets.symmetric( - horizontal: 5.0, - vertical: 5.0, - ), - padding: EdgeInsets.all(5.0), - decoration: BoxDecoration( - color: Colors.white, - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 1, - blurRadius: 0.5, - offset: Offset(1, 1), - ), - ], - ), - ); - } -} From 7c4d03e87b919651b6734ae98abd9fee9e98ec7f Mon Sep 17 00:00:00 2001 From: h7x4 Date: Sun, 23 Aug 2020 00:39:03 +0200 Subject: [PATCH 56/59] Add parts of kanji_search_page to subfolder --- .../kanji__search_page/kanji_search_page.dart | 20 +++++++++---------- .../{ => parts}/examples.dart | 0 .../kanji__search_page/{ => parts}/grade.dart | 0 .../{ => parts}/header.dart | 0 .../{ => parts}/jlpt_level.dart | 0 .../{ => parts}/kunyomi.dart | 0 .../{ => parts}/meaning.dart | 0 .../{ => parts}/onyomi.dart | 0 .../{ => parts}/radical.dart | 0 .../kanji__search_page/{ => parts}/rank.dart | 0 .../{ => parts}/stroke_order_gif.dart | 0 11 files changed, 10 insertions(+), 10 deletions(-) rename lib/components/kanji/kanji__search_page/{ => parts}/examples.dart (100%) rename lib/components/kanji/kanji__search_page/{ => parts}/grade.dart (100%) rename lib/components/kanji/kanji__search_page/{ => parts}/header.dart (100%) rename lib/components/kanji/kanji__search_page/{ => parts}/jlpt_level.dart (100%) rename lib/components/kanji/kanji__search_page/{ => parts}/kunyomi.dart (100%) rename lib/components/kanji/kanji__search_page/{ => parts}/meaning.dart (100%) rename lib/components/kanji/kanji__search_page/{ => parts}/onyomi.dart (100%) rename lib/components/kanji/kanji__search_page/{ => parts}/radical.dart (100%) rename lib/components/kanji/kanji__search_page/{ => parts}/rank.dart (100%) rename lib/components/kanji/kanji__search_page/{ => parts}/stroke_order_gif.dart (100%) diff --git a/lib/components/kanji/kanji__search_page/kanji_search_page.dart b/lib/components/kanji/kanji__search_page/kanji_search_page.dart index 3c054ed..889a48f 100644 --- a/lib/components/kanji/kanji__search_page/kanji_search_page.dart +++ b/lib/components/kanji/kanji__search_page/kanji_search_page.dart @@ -1,17 +1,17 @@ import 'package:flutter/material.dart'; -import 'package:jisho_study_tool/components/kanji/kanji__search_page/examples.dart'; import 'package:unofficial_jisho_api/api.dart' as jisho; -import './grade.dart'; -import './header.dart'; -import './jlpt_level.dart'; -import './meaning.dart'; -import './radical.dart'; -import './rank.dart'; -import './stroke_order_gif.dart'; -import './onyomi.dart'; -import './kunyomi.dart'; +import 'parts/grade.dart'; +import 'parts/header.dart'; +import 'parts/jlpt_level.dart'; +import 'parts/meaning.dart'; +import 'parts/radical.dart'; +import 'parts/rank.dart'; +import 'parts/stroke_order_gif.dart'; +import 'parts/onyomi.dart'; +import 'parts/kunyomi.dart'; +import 'parts/examples.dart'; class KanjiResultCard extends StatelessWidget { final jisho.KanjiResult _result; diff --git a/lib/components/kanji/kanji__search_page/examples.dart b/lib/components/kanji/kanji__search_page/parts/examples.dart similarity index 100% rename from lib/components/kanji/kanji__search_page/examples.dart rename to lib/components/kanji/kanji__search_page/parts/examples.dart diff --git a/lib/components/kanji/kanji__search_page/grade.dart b/lib/components/kanji/kanji__search_page/parts/grade.dart similarity index 100% rename from lib/components/kanji/kanji__search_page/grade.dart rename to lib/components/kanji/kanji__search_page/parts/grade.dart diff --git a/lib/components/kanji/kanji__search_page/header.dart b/lib/components/kanji/kanji__search_page/parts/header.dart similarity index 100% rename from lib/components/kanji/kanji__search_page/header.dart rename to lib/components/kanji/kanji__search_page/parts/header.dart diff --git a/lib/components/kanji/kanji__search_page/jlpt_level.dart b/lib/components/kanji/kanji__search_page/parts/jlpt_level.dart similarity index 100% rename from lib/components/kanji/kanji__search_page/jlpt_level.dart rename to lib/components/kanji/kanji__search_page/parts/jlpt_level.dart diff --git a/lib/components/kanji/kanji__search_page/kunyomi.dart b/lib/components/kanji/kanji__search_page/parts/kunyomi.dart similarity index 100% rename from lib/components/kanji/kanji__search_page/kunyomi.dart rename to lib/components/kanji/kanji__search_page/parts/kunyomi.dart diff --git a/lib/components/kanji/kanji__search_page/meaning.dart b/lib/components/kanji/kanji__search_page/parts/meaning.dart similarity index 100% rename from lib/components/kanji/kanji__search_page/meaning.dart rename to lib/components/kanji/kanji__search_page/parts/meaning.dart diff --git a/lib/components/kanji/kanji__search_page/onyomi.dart b/lib/components/kanji/kanji__search_page/parts/onyomi.dart similarity index 100% rename from lib/components/kanji/kanji__search_page/onyomi.dart rename to lib/components/kanji/kanji__search_page/parts/onyomi.dart diff --git a/lib/components/kanji/kanji__search_page/radical.dart b/lib/components/kanji/kanji__search_page/parts/radical.dart similarity index 100% rename from lib/components/kanji/kanji__search_page/radical.dart rename to lib/components/kanji/kanji__search_page/parts/radical.dart diff --git a/lib/components/kanji/kanji__search_page/rank.dart b/lib/components/kanji/kanji__search_page/parts/rank.dart similarity index 100% rename from lib/components/kanji/kanji__search_page/rank.dart rename to lib/components/kanji/kanji__search_page/parts/rank.dart diff --git a/lib/components/kanji/kanji__search_page/stroke_order_gif.dart b/lib/components/kanji/kanji__search_page/parts/stroke_order_gif.dart similarity index 100% rename from lib/components/kanji/kanji__search_page/stroke_order_gif.dart rename to lib/components/kanji/kanji__search_page/parts/stroke_order_gif.dart From c7f6f8c4b2931196aac820b41e9248c495e6f104 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Mon, 24 Aug 2020 23:45:47 +0200 Subject: [PATCH 57/59] Update search card layout --- lib/components/search/parts/header.dart | 2 + lib/components/search/parts/other_forms.dart | 17 ++++++-- lib/components/search/parts/senses.dart | 42 ++++++++++++++++++++ lib/components/search/search_card.dart | 7 +++- 4 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 lib/components/search/parts/senses.dart diff --git a/lib/components/search/parts/header.dart b/lib/components/search/parts/header.dart index 8849aff..6b75b6a 100644 --- a/lib/components/search/parts/header.dart +++ b/lib/components/search/parts/header.dart @@ -10,6 +10,8 @@ class JapaneseHeader extends StatelessWidget { final hasFurigana = (_word.word != null); return Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.only(left: 10.0), child: Column( children: [ (hasFurigana) ? Text(_word.reading) : Text(''), diff --git a/lib/components/search/parts/other_forms.dart b/lib/components/search/parts/other_forms.dart index e26558f..ca83901 100644 --- a/lib/components/search/parts/other_forms.dart +++ b/lib/components/search/parts/other_forms.dart @@ -8,9 +8,18 @@ class OtherForms extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - child: Row( - children: _otherForms.map((form) => _KanaBox(form)).toList(), - )); + child: Column( + children: [ + Text( + 'Other Forms', + style: TextStyle(fontWeight: FontWeight.bold), + ), + Row( + children: _otherForms.map((form) => _KanaBox(form)).toList(), + ), + ], + ), + ); } } @@ -47,4 +56,4 @@ class _KanaBox extends StatelessWidget { ), ); } -} \ No newline at end of file +} diff --git a/lib/components/search/parts/senses.dart b/lib/components/search/parts/senses.dart new file mode 100644 index 0000000..3d3771d --- /dev/null +++ b/lib/components/search/parts/senses.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:unofficial_jisho_api/parser.dart'; + +class Senses extends StatelessWidget { + final List _senses; + const Senses(this._senses); + + @override + Widget build(BuildContext context) { + final List _senseWidgets = + _senses.map((sense) => _Sense(sense)).toList(); + + return Container( + child: Column( + children: _senseWidgets, + )); + } +} + +class _Sense extends StatelessWidget { + final JishoWordSense _sense; + const _Sense(this._sense); + + @override + Widget build(BuildContext context) { + return Container( + child: Column( + children: [ + Text( + _sense.parts_of_speech.join(', '), + style: TextStyle(fontWeight: FontWeight.bold), + textAlign: TextAlign.left, + ), + Column( + children: + _sense.english_definitions.map((def) => Text(def)).toList(), + ) + ], + ), + ); + } +} diff --git a/lib/components/search/search_card.dart b/lib/components/search/search_card.dart index 6d445f1..20b2032 100644 --- a/lib/components/search/search_card.dart +++ b/lib/components/search/search_card.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:unofficial_jisho_api/api.dart'; import 'parts/header.dart'; +import 'parts/senses.dart'; import 'parts/other_forms.dart'; class SearchResultCard extends StatelessWidget { @@ -19,8 +20,10 @@ class SearchResultCard extends StatelessWidget { Widget build(BuildContext context) { return ExpansionTile( title: JapaneseHeader(_mainWord), - children: [OtherForms(_otherForms)], + children: [ + Senses(_result.senses), + OtherForms(_otherForms), + ], ); } } - From afe92436071c526fa5838c4a7bd55f4728332cd8 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Mon, 24 Aug 2020 23:46:04 +0200 Subject: [PATCH 58/59] Add willpopscope to search page --- lib/bloc/search/search_bloc.dart | 2 +- lib/screens/search.dart | 67 ++++++++++++++++++-------------- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/lib/bloc/search/search_bloc.dart b/lib/bloc/search/search_bloc.dart index 889fdbf..357dee1 100644 --- a/lib/bloc/search/search_bloc.dart +++ b/lib/bloc/search/search_bloc.dart @@ -28,7 +28,7 @@ class SearchBloc extends Bloc { yield SearchError('Something went wrong'); } } else if (event is ReturnToInitialState) { - + yield SearchInitial(); } } } diff --git a/lib/screens/search.dart b/lib/screens/search.dart index a38e5c9..5dd8541 100644 --- a/lib/screens/search.dart +++ b/lib/screens/search.dart @@ -8,33 +8,40 @@ class SearchView extends StatelessWidget { @override Widget build(BuildContext context) { return BlocListener( - listener: (context, state) { - }, - child: BlocBuilder( - builder: (context, state) { - if (state is SearchInitial) return _InitialView(); - else if (state is SearchLoading) return LoadingScreen(); - else if (state is SearchFinished) { - return ListView( - children: state.results.map((result) => SearchResultCard(result)).toList(), - ); - } - }, - ) - ); + listener: (context, state) {}, + child: BlocBuilder( + builder: (context, state) { + if (state is SearchInitial) + return _InitialView(); + else if (state is SearchLoading) + return LoadingScreen(); + else if (state is SearchFinished) { + return WillPopScope( + child: ListView( + children: state.results + .map((result) => SearchResultCard(result)) + .toList(), + ), + onWillPop: () async { + BlocProvider.of(context) + .add(ReturnToInitialState()); + print('Popped'); + return false; + }, + ); + } + throw 'No such event found'; + }, + )); } } class _InitialView extends StatelessWidget { - @override Widget build(BuildContext context) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SearchBar(), - ] - ); + return Column(mainAxisAlignment: MainAxisAlignment.center, children: [ + SearchBar(), + ]); } } @@ -49,12 +56,11 @@ class _LanguageOption extends StatelessWidget { padding: EdgeInsets.symmetric(vertical: 10.0), child: Center(child: Text(_language)), decoration: BoxDecoration( - border: Border.all( - color: Colors.black, - width: 1.0, - ), - color: _color - ), + border: Border.all( + color: Colors.black, + width: 1.0, + ), + color: _color), ), ); } @@ -70,7 +76,8 @@ class SearchBar extends StatelessWidget { child: Column( children: [ TextField( - onSubmitted: (text) => BlocProvider.of(context).add(GetSearchResults(text)), + onSubmitted: (text) => BlocProvider.of(context) + .add(GetSearchResults(text)), controller: TextEditingController(), decoration: InputDecoration( labelText: 'Search', @@ -84,7 +91,7 @@ class SearchBar extends StatelessWidget { ), Row( children: [ - _LanguageOption('Auto', Colors.white), + _LanguageOption('Auto', Colors.white), _LanguageOption('English', Colors.white), _LanguageOption('Japanese', Colors.blue), ], @@ -93,4 +100,4 @@ class SearchBar extends StatelessWidget { ), ); } -} \ No newline at end of file +} From c583ef00d9598125602d5ae598b6111d628425e1 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Mon, 24 Aug 2020 23:50:23 +0200 Subject: [PATCH 59/59] Update readme (#4) * Make readme template * Add search and kanji section --- README.md | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e66db82..7827e81 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,20 @@ -# jisho_study_tool +# Jisho Study tool -A new Flutter project. +A japanese dictionary with features for making studying the language easier. -## Getting Started +## Search -This project is a starting point for a Flutter application. +Standard search using Jishos own API. This returns standard Jisho search results, including what you'd find if you searched for something through the standard jisho search bar without any #modifiers -A few resources to get you started if this is your first Flutter project: +## Kanji Search -- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) +Standard kanji search using the #kanji modifier. This will give you detailed information about things like drawing order, radicals, different kinds of ranks and statistics and some onyomi and kunyomi example words. -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +## Upcoming Features + +* Different kinds of kanji input like radicals and grade based lists +* Favorites, history and custom lists +* Anki export +* Memo cards +* Cloud sync +* Dark theme