Back

Jul 19, 2023

Jul 19, 2023

Dart and Flutter Case Study: Mastering On-Device AI, Melting Away Technical Debt, and Crafting Dream UIs.

Discover how we mastered on-device AI, reduced technical debt, and created next-level UIs in this Dart and Flutter case study.

Dart, Flutter and Pieces logos.
Dart, Flutter and Pieces logos.
Dart, Flutter and Pieces logos.

In this blog post, we’ll explore why Dart and Flutter have been chosen as the pivotal technologies behind developing Pieces for Developers. We start our journey by understanding how Dart and Flutter's extraordinary Foreign Function Interface (FFI) capabilities provide a streamlined and efficient method to interact with precompiled Rust binaries to deliver a highly responsive and enriched app experience for users.

We then dive into the versatility of Dart and Flutter across multiple platforms and their robust synergy with web technologies, which enables the creation of a high-performance desktop application that fits snugly into diverse workflows.

As we navigate through the post, we'll discover how Dart has simplified complex development processes, reduced technical debt, and fostered a unified and efficient development team. We'll also address the relief that Dart and Flutter offer from the chaos of managing browser support by abstracting away complexities and enhancing overall efficiency.

Towards the end of this Dart and Flutter case study, we focus on Flutter's exquisite control over rendering, allowing for the creation of visually stunning, high-quality user interfaces. In conclusion, we discuss how Dart's high-level simplicity combined with the raw power of Rust have been instrumental in realizing our vision for Pieces for Developers. So, let's jump in!

Quick Outline of our Dart & Flutter Case Study:

1. Introduction: A brief overview of the importance of tech stack choices in app development and an introduction to our choice of Dart and Flutter.

2. Harnessing the Power of FFI: Exploration of Dart's FFI capabilities that power on-device Edge-ML Models, allowing for robust data enrichment in our desktop application.

3. Multi-Platform Flexibility and Performance: Discussion of Dart's cross-platform capabilities, integration with existing tools, hardware acceleration utilization, and performance benefits over handwritten JavaScript.

4. Streamlining the Development Process: A look into how Dart simplifies workflows, reduces technical debt, and enhances team scalability. A highlight of Dart's robust typing system.

5. Overcoming Browser Support Chaos: An insight into how Dart and Flutter abstract away the complexities of browser support, aiding in more efficient and manageable development.

6. Gaining Control over Rendering with Flutter: Understanding how Flutter's view of rendering as 'painting pixels' allows for powerful animations and stunning UI elements.

7. Conclusion: A wrap-up of how our decision to use Flutter and Dart shaped the development journey of Pieces for Developers. Plus, a teaser for upcoming articles that share more about our development voyage.

Let’s Jump In!

In the intricate dance of software development, we often find ourselves confronted with a labyrinth of choices. From the nitty-gritty of syntax to the macrocosm of architectural frameworks, every decision shapes the end product and influences how it interacts with its users. The question then arises: why, amongst an ocean of choices, did we gravitate to Dart & Flutter to build Pieces for Developers?

Well, the answer isn't as simple as you might think. It's a mix of practicality, performance, and a touch of that software development magic that's hard to put into words ✨. Today, I'm excited to unpack one of the core reasons for our tech stack choice: Dart and Flutter's mind-blowingly good Foreign Function Interface (FFI) capabilities. Are you ready? Let's dive in! 🏊‍♂️

The Magic of Dart and FFI: Why They Rock Our Developer Socks 🧦

Our journey with Pieces for Developers began with a lofty, ambitious goal. We dreamt of creating a universal desktop app for macOS, Linux, and Windows, a tool that would allow developers to save all types of resources throughout their workflows. But we didn't just want to stop at saving resources — oh no, we aimed to make each saved resource a mini power-pack of useful information. Think tags, titles, descriptions, suggested searches, related people, external documentation links, and so much more. Sounds exciting, right?

To bring this dream to life, we needed a powerhouse to drive this feature. We found our answer in our on-device Micro Models. This is where Dart's brilliant FFI programming capabilities come into play. FFI is the golden ticket that lets Dart converse directly with our compiled Rust binaries. Now, if that sounds a bit like technobabble, stick with me. I promise it's simpler than it sounds.

The Awe of Dart's FFI Magic 🪄

Imagine you're watching a sci-fi show, and there's a universal translator that allows different species from across the galaxies to communicate seamlessly. That's pretty much what FFI does in the development world — it allows different languages to "talk" to each other, bridging the gap between them.

So, when we say that FFI is the golden ticket, it's because it allows us to tap into the raw power of our precompiled Rust binaries, right from our Dart codebase. This means we can have a super-efficient conduit for our on-device Micro Models, leading to a streamlined data enrichment process.

The result? All the heavy lifting is done locally, right on the user's device. Dart's exceptional FFI capabilities allow us to extract the maximum performance from our Rust code without losing any of the benefits of Dart and Flutter's high-level, easy-to-use framework.

So, what does all this tech wizardry mean for you? Quite simply, you get a faster, more efficient, and incredibly responsive experience with Pieces for Developers. Your saved resources are instantly supercharged with additional metadata, providing you with a richer, more informative, and vastly more useful repository of code snippets.

The seamless blend of Dart's high-level simplicity with the raw power of Rust gives us the best of both worlds. It's like having your cake and eating it too — a sweet balance of simplicity and power that's helped us bring our vision for Pieces for Developers to life.

Zooming Out: Dart and Flutter's All-around Flexibility

Now, let's take a step back and look at the bigger picture. In the ever-evolving landscape of development, we’re often faced with building one application to suit multiple platforms. Our app must crisscross through various web and native tools and work with the latest hardware advancements. It's a symphony of complexities, and to create Pieces for Developers, we needed a partner that could keep up with these demands.

Enter Dart and Flutter, the dynamic duo that proved to be our perfect partners in this developmental tango across MacOS, Windows, and Linux, harmonizing with your IDEs, Browsers, and collaborative environments. 🕺💻🎶

A Tool for All Trades— and Platforms

Our vision for Pieces wasn't confined to just being an app. We wanted it to be a 'tool between tools': A tool that not only acted as a repository for your workflows, but also as a dynamic companion. We wanted it to integrate seamlessly with your IDEs and browsers and even tap into the collaborative ecosystems where developers live and breathe.

We also aspired to harness the full power of hardware acceleration for our ML models by tapping into the capabilities built directly into MacOS, Windows, and Linux. Our wishlist didn't stop there, either! We dreamed of squeezing performance out of ARM-based platforms and Apple Silicon.

Guess what? Dart made all of this possible. By offering the ability to build performant binaries, Dart provided the flexibility we craved. Whether it's MacOS, Windows, Linux, ARM-based systems, or Apple Silicon, Dart allows us to build an application that performs brilliantly across all of these use cases.

Web, Meet Flutter. Flutter, Meet Web.

The magic of Dart and Flutter doesn't stop at native platforms. One of the aspects I absolutely love about Flutter/Dart is how beautifully they work with existing web technologies. The Dart-to-JavaScript compiler, Dart2JS, enables our Flutter app to integrate seamlessly with the web. And it's not just about compatibility — Dart2JS is almost 50% more performant than handwritten JavaScript, thanks to its use of Google's Closure Compiler behind the scenes. So, we really do get to have our cake and eat it too 🎂.

Building Powerful CLIs and Modular AOT Binaries with Dart

As developers, we often find ourselves building Dart command-line interface (CLI) tools. This is another area where Dart truly shines. Dart excels when it comes to creating modular Ahead-of-Time (AOT) binaries, which can easily be called as CLIs. This ability is a game-changer in the tooling world, giving developers like us the flexibility to create powerful, performance-optimized tools.

In essence, the power and flexibility of this Dart Flutter example empowered us to deliver a desktop application that is not just high-performance and deeply interactive, but one that also integrates well across platforms and tools, serving as a true companion in your developer workflows.

Streamlining the Workflow with Dart and Flutter

The world of modern web development is like a brightly lit carousel, rotating through a dizzying array of ever-evolving technologies and frameworks. From bundling options like Webpack, ESBuild, and Rollup to a myriad of JavaScript frameworks, and variations like JS, TS, JSX, TSX, Vue, SCSS, SASS, HTML, and CSS — the list is endless and can be a bit overwhelming.

As vibrant as this field is, the multitude of choices presents a challenging landscape to navigate. Staying abreast of these rapid changes can often feel daunting. And let's not even get started on the dreaded 'T' word — Technical Debt. Just as the boogeyman lurks in the darkness, technical debt is a lurking threat in the developer's world. The more complex your tech stack, the more hidey-holes for the boogeyman to creep into.

In our mission to build Pieces for Developers, we aimed for a streamlined, simplified tech stack to keep the technical debt boogeyman at bay, making maintenance easier and the overall project more manageable.

Unified Language for Streamlined Development with Dart

In most Flutter use cases, you have Dart — one language that rules them all. Developing in Dart across every platform means that we can maximize which team members can work on which projects. This is crucial for scaling a team, as any developer familiar with Dart can jump in and contribute to any part of our product. This isn't just beneficial in terms of collaboration; it also makes the codebase more maintainable and easier to understand.

Dart's syntax and structure are similar to many other popular languages. It has a straightforward event loop and solid asynchronous capabilities. This makes Dart accessible to developers from various backgrounds while retaining its power.

Dart's robust typing system, fortified with new Records Capabilities in Dart 3.0, gives our developers many of the same capabilities that TypeScript provides, but within the Dart ecosystem. This means fewer bugs and issues, enabling us to deliver a reliable, high-performance application. Our developers can work more efficiently and cohesively, allowing us to concentrate on delivering the best possible experience to our users.

Dodging the Browser Support Chaos with Dart and Flutter

Managing browser support for web apps is akin to a challenging juggling act. Polyfills, vendor prefixes, performance improvements, multithreading, the variety of frameworks for bringing native capabilities to web apps — all of these are balls to juggle, with the potential to trip up the performance of the web app if not handled correctly. Dart and Flutter, however, gracefully dodge this chaos.

Flutter and Dart brilliantly abstract away a lot of this complexity, enabling developers to focus on building beautiful, functional apps rather than tangling with the intricacies of browser support. This alleviates the need to figure out what polyfills to use for different browser versions or how to manage vendor prefixes.

When considering frameworks to bring native capabilities to web apps, Dart and Flutter provide a singular, robust solution, simplify technical decision-making, and help manage technical debt effectively. Our choice of Dart and Flutter to build Pieces for Developers allowed us to sidestep the browser support chaos, paving the way for an efficient, streamlined development process.

Pixel Perfection: Harnessing the Rendering Power of Flutter

Building user interfaces is an art, with each pixel and each element contributing to the overall user experience. Flutter offers an unrivaled level of control over rendering. With Flutter, we're not just laying out DOM elements — we're painting pixels. This perspective unlocks powerful animations, stunning UI elements, and more — features typically demanding modern CSS and clever DOM structures.

But Flutter's power doesn't stop at rendering. It extends to testing and developer tooling, ensuring our application is top-notch quality, bug-free, and ready for production. Flutter gives us the palette to paint our vision, test our creation, and bring our masterpiece to life, quickly!

Choosing Flutter empowered us to control and elevate our development process to new heights. It's not just about building an app, but creating an experience — a digital masterpiece that's pixel perfect, top-quality, and simply stunning.

Wrapping up the Dart and Flutter Case Study… but more to come!

As we wrap up this exploration of Dart and Flutter's role in building Pieces for Developers, let's reflect on the key insights we've gleaned. We unveiled how Dart and Flutter's Foreign Function Interface (FFI) capabilities supercharge our data enrichment process, giving us a high-performing and efficient app. We also witnessed the pair's adaptability, effortlessly bridging gaps across multiple platforms and web technologies.

We explored Dart's role in streamlining our development process, curbing technical debt, and fostering a unified team. Dart and Flutter's effective management of browser support complexities also came to light, adding to the efficiency gains.

Finally, we celebrated Flutter's control over rendering that allows the creation of visually stunning, high-quality user interfaces.

In summary, our choice to learn Flutter and Dart and use it in our development was a strategic one, driven by their unique ability to meld simplicity and power, while promoting a superior user experience.

As we close this chapter, we look forward to embarking on the next phase of our journey in the ever-evolving world of software development. Here's to the shared insights and breakthroughs that lie ahead! 🚀

Further Reading and Resources 📚

Now that we've taken a deep dive into Dart, Flutter, and their role in building Pieces for Developers, you might want to continue your exploration and delve deeper into these topics.

To further explore the themes discussed in this Dart and Flutter case study, here are some great resources to check out:

1. What's new in Dart and Flutter Google I/O 2023: Catch up on the latest from Dart and Flutter, straight from Google I/O 2023.

2. Announcing Dart 3: Learn about the key features of Dart 3, including 100% sound null safety, records, patterns, and class modifiers.

3. Evolving Flutter's Web Support: Dive into the evolution of Flutter's web support and see what's coming in the pipeline.

4. Flutter Rust Bridge: Check out this open-source project that provides high-level, memory-safe binding generation for Flutter/Dart <-> Rust.

5. 5 Advantages of Dart Over JavaScript, Python, and Bash: Discover why Dart is gaining popularity and how it stacks up against JavaScript, Python, and Bash.

6. Why Flutter is the Silver Bullet to Reduce App Development Cost: This article on Hacker Noon discusses how Flutter can significantly reduce app development costs.

7. Dart VS Javascript benchmarks: A fascinating look at how Dart and JavaScript compare in terms of performance.

8. Using FFI in a Flutter plugin Codelab: This hands-on codelab provides a practical guide on using FFI in a Flutter plugin.

9. How to Implement Any UI in Flutter: This FreeCodeCamp article shares some useful tips and tricks on implementing any UI design in Flutter.

These resources should give you a deeper understanding of Dart and Flutter, and provide insight into how they were used in the creation of Pieces for Developers. Enjoy diving in!

Photo of the author: Tsavo Knott.
Photo of the author: Tsavo Knott.

Written by

Written by

Tsavo Knott

Tsavo Knott

SHARE

SHARE

Title

Title

our newsletter

Sign up for The Pieces Post

Check out our monthly newsletter for curated tips & tricks, product updates, industry insights and more.

our newsletter

Sign up for The Pieces Post

Check out our monthly newsletter for curated tips & tricks, product updates, industry insights and more.

our newsletter

Sign up for The Pieces Post

Check out our monthly newsletter for curated tips & tricks, product updates, industry insights and more.