DEV Community

Ratratatyu
Ratratatyu

Posted on • Edited on

I'm back to my first Flutter project! GitHub Finish-Up-A-Thon Challenge

GitHub “Finish-Up-A-Thon” Challenge Submission

This is a submission for the GitHub Finish-Up-A-Thon Challenge

Hello everyone! I'm participating in a DEV challenge for the second time. For me, the GitHub Finish-Up-A-Thon Challenge is an amazing opportunity to breathe new life into an old project, measure my personal progress, and prove to myself that I can finish what I start.

Background: Where It All Began (Before)

My journey into mobile development started not so long ago — in December 2025. About four months ago, I participated in a one-week challenge here on DEV for the first time. At that time, the task felt crazy for me: build a working MVP over a weekend that solved a real problem for people I knew. That post can still be found on my profile. Back then, I had only a vague understanding of how Flutter worked, how its architecture was structured, and how state management functioned. But the tight deadline highlighted my blind spots. Most importantly, after the contest ended, I didn't abandon the code — I kept learning every single day.

When GitHub announced this challenge, I immediately knew which project I wanted to revive. I pulled out my first MVP and decided to transform it from a quick prototype into a mature, structured application. (Well, more or less.)

My Smart Teammate: How AI Helped (GitHub Copilot)

Let's be honest: coming back to your old code, written in a rush, is a special kind of pain. My AI assistant became a true lifesaver. It acted like an experienced mentor who stayed awake with me and helped me make architectural decisions.

Here are just a few ways AI helped me tremendously:

  1. Refactoring and Dart pitfalls: When rewriting the task deletion logic, I instinctively used _tasks.remove(taskIndex). The code either didn't work or crashed. Copilot instantly explained the difference between remove and removeAt, and then suggested an even cleaner solution using removeWhere, reducing the logic to a single line.

  2. Fixing UI syntax errors: While integrating a pie chart, I got confused with if/else conditions directly inside the sections list. The assistant helped me properly structure the code using the spread operator (...[ ]), which saved the screen from crashing.

  3. Architectural guidance: It suggested using callback functions (onFinished) to safely connect the timer and navigation without unnecessarily expanding the state.

What Changed: Project Evolution (After)

The project has been completely transformed. I migrated it to a Feature-First architecture, cleaned up naming according to Effective Dart guidelines, and fully separated UI from business logic.

1. Main Room: Motivation and Analytics

I kept my favorite cat widget on the home screen but completely redesigned the lower section:

Interactive Chart: Using the fl_chart package, I implemented a pie chart that calculates the ratio of completed and remaining tasks in real time by reading data from the provider.

Quote Widget: Below the chart, motivational phrases smoothly change every 5 minutes. It's a standalone reactive widget built with Stream.periodic, which avoids unnecessary system-wide rebuilds.

a gif shpwing how app work

2. Focus Room: 3D Wheels and Forced Landscape

Custom Timer: To select time, I used ListWheelScrollView, creating stylish scrollable 3D hour and minute wheels.

Landscape Mode: When a focus session starts, the app automatically switches to landscape orientation. Users can place their phone beside a laptop and comfortably study or code.

a gif showing how timer in app work

3. Daily Tasks: Lists Without Memory Leaks

Tasks are displayed using ListView.builder, optimizing memory consumption.

  1. Tasks are added through a clean AlertDialog.

  2. Native swipe-to-delete functionality is implemented using Dismissible.

When the checkbox is tapped, the task text becomes strikethrough, the chart updates, and the user earns XP. To prevent abuse, completed tasks cannot be marked as incomplete again — the checkbox becomes disabled.

Checkbox(
  value: task.isCompleted,
  activeColor: colorScheme.primary,
  onChanged: task.isCompleted
    ? null 
    : (value) => taskProvider.completeTask(task.id),
)
Enter fullscreen mode Exit fullscreen mode

a gif showing how tasks working

4. Triumph Screen (Level Up)

When a new level is reached, the application redirects the user to a level-up screen featuring a cat. The screen calculates the current level, XP, and the remaining points needed for the next upgrade.

a gif showin how level up screen working

My Biggest Challenges and Growth Areas (I Need Your Advice!)

I want to be honest with the community and the judges. The project isn't perfect, and there are still areas for improvement:

Local Date State: Tasks currently cannot automatically reset their completion status each day. I still need to dive deeper into local storage and SharedPreferences to properly handle date-based logic.

Responsive UI: This is the most difficult Flutter topic for me. The layout behaves differently across devices.

Question for the community: How do you adapt your Flutter applications for different screen sizes? Which approaches or packages do you use (flutter_screenutil, LayoutBuilder, or simply media queries)? I'd love to hear your advice!

Final Thoughts

Over the past three months, I've made a huge leap in quality. My code has become cleaner, the architecture more understandable, and thanks to AI assistants, I've learned how to find and fix silly syntax errors much faster. In the near future, I plan to implement state persistence, finally conquer responsive design, and publish this application on Google Play!

A huge thank you to GitHub and DEV for this challenge. It gave me a clear way to see my progress — before and after.

Good luck to all participants! Feel free to share your thoughts in the comments — it means a lot to me! 💜

The project is available on GitHub: https://github.com/RatRatatyu/SoloLearningApp

In the v1 branch, you can see the previous version of the project. The new version is available in the v2 branch and in main.

Top comments (0)