A minimalist, offline-first flashcard app built with Flutter to help users learn Japanese vocabulary daily. Designed for simplicity, modularity, and future extensibility (e.g., voice playback, user-added words, score tracking, notifications).
- ✅ Quiz mode to test vocabulary
- ✅ Offline support with local storage
- ✅ Preloaded vocabulary set
- ✅ User-added custom words
- ✅ Daily notification reminders to study
- ✅ Future-ready voice playback (TTS)
- ✅ Future score tracking
- 🚫 No login, no cloud sync
- Flutter: UI and app logic
- Hive: Local storage for flashcards and user data
- flutter_tts: Text-to-speech for Japanese pronunciation
- flutter_local_notifications: Daily reminders
The structure follows typical conventions, separating code into different logical directories:
These folders are standard for a Flutter/Dart project and often relate to build systems, platform-specific code, and project configuration.
| Folder/File | Purpose |
|---|---|
| .dart_tool/ | Files generated by the Dart tooling. |
| android/ | Android-specific code and resources. |
| assets/ | Resources like images, fonts, or data files. |
| build/ | Compiled application output files. |
| ios/ | iOS/macOS-specific code and resources. |
| lib/ | Primary application source code (most important). |
| linux/, macos/, web/, windows/ | Platform-specific code for desktop and web. |
| test/ | Unit and widget tests. |
| pubspec.yaml | Project dependencies, metadata, and assets configuration. |
| main.dart | The application's entry point. |
The core logic is within the lib folder, which is well-organized into modules, models, screens, services, and widgets.
This directory holds the data models for the application, defining the structure of the data used in the app (like objects received from an API or database).
flashcard.dart,flashcard.g.dartlesson.dart,lesson.g.dartquiz_result.dart,quiz_result.g.dartunit.dart,unit.g.dart
The
.g.dartfiles suggest the use of code generation (like thejson_serializablepackage) for tasks such as JSON serialization.
This is where the main user interfaces (UIs) or pages of the app are defined. It's further organized into sub-folders based on feature/functionality:
- Custom_Quiz/: Code for the custom quiz creation and playing screens.
custom_quiz_question_screen.dartcustom_quiz_screen.dartcustom_quiz_select_screen.dart
- Flashcard/: Code related to the flashcard viewing and management screens.
flashcard_main_lesson_screen.dartflashcard_main_screen.dart
- Quiz/: Code for the standard quiz flow.
quiz_history_screen.dartquiz_question.dartquiz_result_screen.dart
- Top-Level Screens:
all_updates_screen.dartcredits_screen.dartfuture_updates_screen.darthome_screen.dart
Contains classes that implement application services or business logic, often dealing with background tasks or platform features.
notification_service.dart
Contains reusable UI components that are smaller than a full screen.
flashcard_item.dart(A component to display a single flashcard within a list.)
class Flashcard {
final String japanese;
final String meaning;
final String pronunciation;
bool isLearned;
}class UserWord {
final String japanese;
final String meaning;
final String pronunciation;
}To enable daily reminders:
dependencies:
flutter_local_notifications: ^16.1.0Example setup:
final FlutterLocalNotificationsPlugin notificationsPlugin = FlutterLocalNotificationsPlugin();
Future<void> schedulePeriodicNotification({
required String title,
required String body,
required RepeatInterval interval,
}) async {
const AndroidNotificationDetails androidDetails =
AndroidNotificationDetails(
'periodic_channel',
'Periodic Notifications',
channelDescription: 'Periodic reminders for flashcard learning',
importance: Importance.high,
priority: Priority.high,
);
const NotificationDetails notificationDetails = NotificationDetails(
android: androidDetails,
);
await flutterLocalNotificationsPlugin.periodicallyShow(
0,
title,
body,
interval, // e.g., RepeatInterval.daily
notificationDetails,
androidScheduleMode: AndroidScheduleMode.inexact,
);
}dependencies:
flutter_tts: ^3.6.3final FlutterTts flutterTts = FlutterTts();
await flutterTts.setLanguage("ja-JP");
await flutterTts.speak("こんにちは");- Clone the repo
- Run
flutter pub get - Run
flutter runon your device/emulator
- 🔊 Flutter tts listening lesson tests
- 🧠 Paragraph test
- 📤 Export/import user words
- 🌙 Dark mode