Add kanji page
This commit is contained in:
@@ -1,81 +1,37 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:tangocard_reader/models/yokutango_entry.dart';
|
||||
import 'package:tangocard_reader/screens/error.dart';
|
||||
import 'package:tangocard_reader/screens/loading.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:tangocard_reader/service/tangocard_files.dart';
|
||||
|
||||
class Home extends StatelessWidget {
|
||||
import 'pages/tango_set_list.dart';
|
||||
|
||||
class Home extends StatefulWidget {
|
||||
const Home({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
State<Home> createState() => _HomeState();
|
||||
}
|
||||
|
||||
class _HomeState extends State<Home> {
|
||||
int page = 0;
|
||||
|
||||
final _pages = [
|
||||
TangoSetList(files: tangocardFilePaths, route: '/list/tango',),
|
||||
TangoSetList(files: kanjicardFilePaths, route: '/list/kanji',),
|
||||
];
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text("よく単語"),
|
||||
centerTitle: true,
|
||||
),
|
||||
body: const TangocardList());
|
||||
}
|
||||
}
|
||||
|
||||
class TangocardList extends StatelessWidget {
|
||||
const TangocardList({Key? key}) : super(key: key);
|
||||
|
||||
Future<Map<File, List<YokutangoEntry>>> get tangocardFilePaths => rootBundle
|
||||
.loadString('AssetManifest.json')
|
||||
.then(
|
||||
(json) => jsonDecode(json)
|
||||
.keys
|
||||
.where((String key) =>
|
||||
key.contains('yokutango/json/') && key.contains('.json'))
|
||||
.toList(),
|
||||
)
|
||||
.then(
|
||||
(l) async => Map.fromIterables(
|
||||
l.map<File>((f) => File(f)),
|
||||
await Future.wait<List<YokutangoEntry>>(
|
||||
l
|
||||
.map<Future<List<YokutangoEntry>>>(
|
||||
(String t) => rootBundle
|
||||
.loadString(t)
|
||||
.then<List<YokutangoEntry>>((s) => jsonDecode(s)
|
||||
.map<YokutangoEntry>(
|
||||
(e) => YokutangoEntry.fromJson(e))
|
||||
.toList()),
|
||||
)
|
||||
),
|
||||
body: _pages[page],
|
||||
bottomNavigationBar: BottomNavigationBar(
|
||||
onTap: (int index) => setState(() => page = index),
|
||||
currentIndex: page,
|
||||
items: const [
|
||||
BottomNavigationBarItem(label: 'Tango', icon: Icon(Icons.style)),
|
||||
BottomNavigationBarItem(label: 'Kanji', icon: Text('漢字')),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return FutureBuilder(
|
||||
future: tangocardFilePaths,
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasError) {
|
||||
debugPrint(snapshot.error.toString());
|
||||
return const ErrorScreen();
|
||||
} else if (!snapshot.hasData) {
|
||||
return const LoadingScreen();
|
||||
}
|
||||
|
||||
return ListView(
|
||||
children: (snapshot.data as Map<File, List<YokutangoEntry>>)
|
||||
.entries
|
||||
.map(
|
||||
(e) => ListTile(
|
||||
title: Text(
|
||||
"${e.key.uri.pathSegments.last} - ${e.value.length} cards"),
|
||||
onTap: () => Navigator.pushNamed(context, '/tangolist',
|
||||
arguments: e.key),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,24 +1,23 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:tangocard_reader/models/router_args.dart';
|
||||
import 'package:tangocard_reader/models/yokutango_entry.dart';
|
||||
import 'package:tangocard_reader/screens/error.dart';
|
||||
import 'package:tangocard_reader/screens/loading.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:tangocard_reader/models/data_entry.dart';
|
||||
import 'package:tangocard_reader/models/router_args.dart';
|
||||
import 'package:tangocard_reader/screens/misc/error.dart';
|
||||
import 'package:tangocard_reader/screens/misc/loading.dart';
|
||||
|
||||
class TangoList extends StatelessWidget {
|
||||
class KanjiList extends StatelessWidget {
|
||||
final File file;
|
||||
|
||||
const TangoList({
|
||||
required this.file,
|
||||
const KanjiList({
|
||||
Key? key,
|
||||
required this.file,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
Widget build(BuildContext context) => Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text(file.uri.pathSegments.last),
|
||||
),
|
||||
@@ -33,7 +32,7 @@ class TangoList extends StatelessWidget {
|
||||
}
|
||||
|
||||
final entries = (jsonSnapshot.data as List)
|
||||
.map((e) => YokutangoEntry.fromJson(e))
|
||||
.map((e) => KanjiEntry.fromJson(e))
|
||||
.toList();
|
||||
|
||||
return ListView(
|
||||
@@ -44,7 +43,7 @@ class TangoList extends StatelessWidget {
|
||||
i,
|
||||
ListTile(
|
||||
title: Text(e.toString()),
|
||||
onTap: () => Navigator.pushNamed(context, '/benkyou',
|
||||
onTap: () => Navigator.pushNamed(context, '/benkyou/kanji',
|
||||
arguments: BenkyouArgs(cards: entries, index: i)),
|
||||
),
|
||||
),
|
||||
@@ -53,7 +52,7 @@ class TangoList extends StatelessWidget {
|
||||
.toList(),
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
61
lib/screens/pages/tango_list.dart
Normal file
61
lib/screens/pages/tango_list.dart
Normal file
@@ -0,0 +1,61 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:tangocard_reader/models/data_entry.dart';
|
||||
import 'package:tangocard_reader/models/router_args.dart';
|
||||
import 'package:tangocard_reader/screens/misc/error.dart';
|
||||
import 'package:tangocard_reader/screens/misc/loading.dart';
|
||||
|
||||
class TangoList extends StatelessWidget {
|
||||
final File file;
|
||||
|
||||
const TangoList({
|
||||
required this.file,
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text(file.uri.pathSegments.last),
|
||||
),
|
||||
body: FutureBuilder(
|
||||
future:
|
||||
rootBundle.loadString(file.path).then((data) => jsonDecode(data)),
|
||||
builder: (context, jsonSnapshot) {
|
||||
if (jsonSnapshot.hasError) {
|
||||
return const ErrorScreen();
|
||||
} else if (!jsonSnapshot.hasData) {
|
||||
return const LoadingScreen();
|
||||
}
|
||||
|
||||
final entries = (jsonSnapshot.data as List)
|
||||
.map((e) => YokutangoEntry.fromJson(e))
|
||||
.toList();
|
||||
|
||||
return ListView(
|
||||
children: entries
|
||||
.asMap()
|
||||
.map(
|
||||
(i, e) => MapEntry(
|
||||
i,
|
||||
ListTile(
|
||||
title: Text(e.toString()),
|
||||
onTap: () => Navigator.pushNamed(
|
||||
context,
|
||||
'/benkyou/tango',
|
||||
arguments: BenkyouArgs(cards: entries, index: i),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
.values
|
||||
.toList(),
|
||||
);
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
||||
46
lib/screens/pages/tango_set_list.dart
Normal file
46
lib/screens/pages/tango_set_list.dart
Normal file
@@ -0,0 +1,46 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:tangocard_reader/screens/misc/error.dart';
|
||||
import 'package:tangocard_reader/screens/misc/loading.dart';
|
||||
|
||||
class TangoSetList extends StatelessWidget {
|
||||
final String route;
|
||||
final Future<Map<File, List>> files;
|
||||
|
||||
const TangoSetList({
|
||||
Key? key,
|
||||
required this.route,
|
||||
required this.files,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => FutureBuilder(
|
||||
future: files,
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasError) {
|
||||
debugPrint(snapshot.error.toString());
|
||||
return const ErrorScreen();
|
||||
} else if (!snapshot.hasData) {
|
||||
return const LoadingScreen();
|
||||
}
|
||||
|
||||
return ListView(
|
||||
children: (snapshot.data as Map<File, List>)
|
||||
.entries
|
||||
.map(
|
||||
(e) => ListTile(
|
||||
title: Text(
|
||||
"${e.key.uri.pathSegments.last} - ${e.value.length} cards"),
|
||||
onTap: () => Navigator.pushNamed(
|
||||
context,
|
||||
route,
|
||||
arguments: e.key,
|
||||
),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:tangocard_reader/components/flashcard.dart';
|
||||
import 'package:tangocard_reader/models/yokutango_entry.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:tangocard_reader/models/data_entry.dart';
|
||||
|
||||
class FlashcardView extends StatefulWidget {
|
||||
final List<YokutangoEntry> cards;
|
||||
Reference in New Issue
Block a user