
π‘ An offline Flutter todo list app using Dart & SQLite Database with notification reminders & latest UI designs.
Report Bugs
Β·
Request Features
Table of Contents
An offline, singleβdevice toβdo app built with Flutter and SQLite. Features task management with reminders, date/time pickers, and filtering capabilities.
- β Task Management - Create, edit, delete tasks with title and optional description
- β° Smart Scheduling - Date and time pickers with reminder notifications
- π Repeat Rules - Daily, Weekly, Monthly options with custom weekday selection
- π Advanced Filtering - Filter by date, time, completion status, repeat rules, and reminders
- π± Intuitive UI - Swipe-to-delete completed tasks, clean Material Design
- πΎ Offline First - Local SQLite storage, no network required
- ποΈ Data Management - Clear all data option in settings
Flutter is an open source framework developed and supported by Google. App Developers use Flutter to build mobile apps for multiple platforms (iOS/android) with a single codebase.
This is an example of how you may give instructions on setting up your project locally. To get a local copy up and running follow these simple example steps.
- Flutter SDK (3.0+)
- Dart SDK (3.2.6+)
- Android Studio or VS Code with Flutter extension
Make sure you have git
installed, type git --version
in your cmd. (git official download page: https://git-scm.com/downloads)
git --version
Steps to install code and app into your local device (and run app on emulator or mobile device)
- Fork this repository (and leave a star if you like) by click on the
fork
button on the top right side. - From your copy of this repo located
yourname/doable-todo-list-app
, copy the code link:https://github.com/your-user-name/doable-todo-list-app.git
- Create a folder named
doable
in your local device to store these files. - Open terminal and type
cd path/to/doable
(replace/path/to/doable
with the real path to the newdoable
folder we created in step 3)
cd path/to/doable
5. Clone your copy of this repo using `git clone link-you-copied-in-step-2`
git clone https://github.com/your_username_/doable-todo-list-app.git
- Open the folder
doable/doable-todo-list-app
in your code editor (I use VS Code) & start coding. - Run
emulator
or connect your mobile device with cable to run app on mobile.
Technology | Purpose | Version |
---|---|---|
Flutter | UI Framework | 3.0+ |
SQLite | Local Database | via sqflite ^2.4.0 |
SharedPreferences | Settings Storage | ^2.3.2 |
flutter_svg | Vector Graphics | ^2.0.10 |
intl | Date Formatting | ^0.20.2 |
url_launcher | External Links | ^6.3.0 |
lib/
βββ main.dart # App entry point
βββ screens/ # UI screens
β βββ home_page.dart # Main task list
β βββ add_task_page.dart # Create new tasks
β βββ edit_task_page.dart # Modify existing tasks
β βββ settings_page.dart # App settings
βββ data/ # Data layer
β βββ database_service.dart # SQLite management
β βββ task_dao.dart # Database operations
βββ models/ # Data models
β βββ task_entity.dart # Task data structure
βββ task_repository.dart # Repository pattern facade
CREATE TABLE tasks(
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
description TEXT,
time TEXT, -- Display format: "11:30 AM"
date TEXT, -- Display format: "26/11/24"
has_notification INTEGER NOT NULL DEFAULT 0,
repeat_rule TEXT, -- "Daily" | "Weekly" | "Monthly" | "Weekly:"
completed INTEGER NOT NULL DEFAULT 0,
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT
);
The app follows a clean layered architecture:
graph TB
A[Presentation Layer] --> B[Repository Layer]
B --> C[Data Access Layer]
C --> D[SQLite Database]
A --> E[SharedPreferences]
subgraph "Presentation Layer"
A1[HomePage]
A2[AddTaskPage]
A3[EditTaskPage]
A4[SettingsPage]
end
subgraph "Data Layer"
C1[TaskDao]
C2[DatabaseService]
end
- Presentation Layer: Stateful/Stateless widgets managing UI state
- Repository Layer: TaskRepository as a facade for future extensibility
- Data Access Layer: TaskDao + DatabaseService for SQLite operations
- Domain Model: TaskEntity for data serialization
android {
compileSdk 34
defaultConfig {
minSdk 21
targetSdk 34
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
}
- Debug: Development with debug symbols
- Release: Optimized production build
final task = TaskEntity(
title: "Complete project documentation",
description: "Write comprehensive README",
time: "2:30 PM",
date: "27/01/25",
hasNotification: true,
repeatRule: "Daily",
completed: false,
);
await TaskDao.insert(task);
// Filter by completion status
final incompleteTasks = tasks.where((t) => !t.completed).toList();
// Filter by date
final todayTasks = tasks.where((t) => t.date == "27/01/25").toList();
// Filter by repeat rule
final weeklyTasks = tasks.where((t) =>
t.repeatRule?.startsWith("Weekly") == true
).toList();
- Add, edit and remove tasks
- Complete task and undo completion
- Display tasks on home screen
- Completed tasks are striked through, swipe to delete
- Completed tasks move to the bottom
- Repeat feature (daily, weekly, monthly, no repeat)
- Set date and time for task
- Notification reminders
- Cloud Sync - Optional cloud backup and sync
- Rich Notifications - Local notification scheduling
- Advanced Repeats - Custom repeat patterns
- Categories & Tags - Task organization
- Dark Mode - Theme customization
- Collaboration - Shared task lists
- Analytics - Productivity insights
- Export/Import - JSON backup functionality
- Widget Support - Home screen widgets
See the open issues for a full list of proposed features (and known issues).
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement".
Don't forget to give the project a star! Thanks again!
- Fork this repository (and leave a star if you like) by click on the
fork
button on the top right side. - From your copy of this repo located
yourname/doable-todo-list-app
, copy the code link:https://github.com/your-user-name/doable-todo-list-app.git
- Create a folder named
doable
in your local device to store these files. - Open terminal and type
cd path/to/doable
(replace/path/to/doable
with the real path to the newdoable
folder we created in step 3)
cd path/to/doable
- Clone your copy of this repo using
git clone [link you copied in step 2]
git clone https://github.com/your_username_/doable-todo-list-app.git
- Navigate to the root folder of this project
cd /path/to/doable-todo-list-app
- DO NOT MAKE CHANGES TO THE main BRANCH, create your own branch and name it your name
git branch my-user-name
- Confirm that your new branch
my-user-name
is created
git branch
- Select your new branch
my-user-name
and work on that branch only
git checkout my-user-name
- Confirm that you are in your branch
my-user-name
and NOT onmain
git branch
- You have to shift to
main
branch first but do NOTpush
tomain
branch
git checkout main
- Perform a
pull
to stay updated. It must showAlready up-to-date
git pull
- Now you have to shift back to your branch
my-user-name
again before you can continue editing code
git checkout my-user-name
- Perform a
pull
again inmy-user-name
your own branch
git pull
- Confirm you are in
my-user-name
your own branch
git branch
- Push the changes
git add .
git commit -m "issue #24 fixed"
- Choose
git push origin HEAD
, do NOT choosegit push origin HEAD:master
git push
git push origin HEAD
Distributed under the MIT License. Click LICENSE.md for more information.
- Flutter Team for the amazing framework
- SQLite for reliable local storage
- Material Design for design inspiration
Akhin Abraham - instagram.com/akhinabr - theakhinabraham@gmail.com
Repository Link: https://github.com/theakhinabraham/doable-todo-list-app
Here are some resource links to help with this project and it's contribution: