17 ms·
Show HN: Rust GUI Library via Flutter
Hi, I made a bridge (https://github.com/fzyzcjy/flutter_rust_bridge https://github.com/fzyzcjy/flutter_rust_bridge v2.0.0) between Flutter and Rust, which auto translates syntaxes like arbitrary types, &mut, async, traits, results, closure (callback), lifetimes, etc. The goal is to make a bridge between the two, seamlessly as if working in one single language.
Then, as an example, I showed how to write Rust applications with GUI by utilizing Flutter. That is discussed in the link in details.
To play with it, please visit the GitHub repo, or refer to the end of the article for detailed folders and commands.
When I first released 1.0.0 years ago, it only contained few features compared to today. It is the result of the hard work of contributors and me, and many thanks to all the contributors!
- polyaniline 2y agoHow does this compare to rinf?
- abound 2y agoAnd then there's also crux [1], which is the same "write your mobile app business logic once in Rust", but instead of Flutter, integrates directly with native iOS/Android/Web UIs [1] https://redbadger.github.io/crux/ https://redbadger.github.io/crux/
- oneshtein 2y agoTauri supports mobile platforms too. Sadly, it's not a first class citizen in Tauri 2.0 as promised. I tried both Flutter and Tauri. IMHO: Tauri is better, because it allows me to use existing web frameworks (or even plain Markdown + Pandoc!), to make web-pages, while handling business logic in type safe Rust.
- itohihiyt 2y agoIsn't Dart type safe?
- oneshtein 2y agoDart is order of magnitude slower than Rust.
- mdhb 2y agoIf you’re doing some super intensive data processing or have specialist use cases then yeah, sure feel free to write that part in Rust, C or whatever you like. That’s literally what this package is about. Unlocking that use case for you although Dart also has bindings for Go, Java, Kotlin, C, and Swift so you can take your pick. But the reality is that Dart compiles down to native code on all platforms and is not going to be slower in any way that actually matters or is noticeable to users in the vast vast vast majority of scenarios and the productivity hit you take from moving to Rust or C from Dart is also an order of magnitude slower.
- itohihiyt 2y agoI wasn't trying to be argumentative, and certainly rust is faster than dart, but if type safety is your main concern Dart/Flutter is less convoluted/complicated than rust+web frontend. In my opinion, obviously.
- fzyzcjy 2y agoThanks for the information, and I replied bubblebeard above about Tauri.
- fzyzcjy 2y agoYes, if someone needs to write UI using native Android/iOS code, Crux would be suitable. On the other hand, personally speaking, I prefer to write all code 1 time, but Crux seems to require to write the UI code 3 times for Android+iOS+Web.
- fzyzcjy 2y agoThe first image at the bottom of that post may be related to your question: https://www.reddit.com/r/rust/comments/191b2to/rinf_copies_a_lot_from_flutter_rust_bridge_but/ https://www.reddit.com/r/rust/comments/191b2to/rinf_copies_a... Btw, why is your name green?
- operator-name 2y agoGreen usernames mean they're a new account! Here's a quote from the official FAQs: > What do green usernames mean? > Green indicates a new account. https://news.ycombinator.com/newsfaq.html https://news.ycombinator.com/newsfaq.html
- fzyzcjy 2y agoThank you!
- satvikpendem 2y agoNote that the linked thread by OP has now been resolved and the rinf author fixed and apologized [0]. This thread might be a better start on the differences [1]. [0] https://github.com/cunarist/rinf-status-report https://github.com/cunarist/rinf-status-report [1] https://www.reddit.com/r/FlutterDev/comments/1dnwagk/flutter_rust_bridge_v2_vs_rinf/ https://www.reddit.com/r/FlutterDev/comments/1dnwagk/flutter...
- burakemir 2y agoInteresting! IIUC this is done using source-to-source translation? It is a bit hard to understand from the docs what technical approach is. The docs are clearly aimed at users and I find them impressive, well done. I'd be interested in knowing the approach and how it compares to wasm based Rust web frameworks before diving more deeply into it. One advantage of combining Rust with Flutter seems to be that Flutter is a whole framework already and one would be able to share code and data structures between server and client side. A comparison with other ways Rust
- fzyzcjy 2y agoThanks! Shortly speaking, the Rust code is parsed (e.g. "here is a function and there is a struct"), and then some Rust and Flutter code are generated. As for comparison, some pros and cons are discussed in the blog.
- tmpfs 2y agoI have been using this to build an app[0] for the last couple of years and I want to say that it has been a pleasure to use, there are some wrinkles but overall I have been very happy with the experience. Upgrading from v1 to v2 was not too difficult and v2 is a significant upgrade with lots of useful features, massively improved codegen experience and support for tokio async were the big gamechangers for me. Writing all the app business logic in Rust and using Dart as the front-end works out really well. I know Flutter/Dart doesn't get much love here on HN but in my opinion I think it's much easier to reason about than a system like React which I think is the wrong level of abstraction compared to Flutter's render the entire widget tree approach. Massive thanks to @fzyzcjy for all the work on FRB, great job! [0]: https://saveoursecrets.com https://saveoursecrets.com
- fzyzcjy 2y agoYou are welcome, and happy to hear it works for you!
- MrJohz 2y ago> I know Flutter/Dart doesn't get much love here on HN but in my opinion I think it's much easier to reason about than a system like React which I think is the wrong level of abstraction compared to Flutter's render the entire widget tree approach. Could you expand on this a bit? My impression was that Flutter and React had relatively similar approaches to components, but I haven't had much experience with Flutter yet, so I'm interested to hear your experiences!
- mdhb 2y agoI’m too lazy right now to get into all of the specifics but just wanted to drop a quick note to say that I’ve been doing web development since 1997 and the difference between React and Flutter is like day and night. It’s genuinely hard for me to overstate the general quality of life improvements both from the developer experience and the overall quality of the apps I can produce in any given time frame. A big part of the reason for that is Dart is itself hands down the nicest language I’ve ever worked with. The team behind it got real serious when it comes to tooling and language design and everytime I have to go back to TypeScript I feel like I’m trying to run with a 50kg backpack on.
- blopker 2y agoWhile I don't see the advantage of writing UI in Rust vs Dart, I'm a huge fan of flutter_rust_bridge. The work fzyzcjy and the community have put into calling Rust code from Dart seamlessly is such an asset to Flutter apps. I remade the popular image compression app ImageOptim in Flutter over a weekend because webp wasn't supported. After a little pain in the initial setup, I was able to call mature Rust image libraries using flutter_rust_bridge and a small wrapper[0]. It even handled all the parallelism for me. The app ended up being more capable and faster than ImageOptim, largely just because of the Rust integration. Thank you fzyzcjy! [0]: https://github.com/blopker/alic/blob/main/rust/src/api/compressor.rs https://github.com/blopker/alic/blob/main/rust/src/api/compr...
- deleted 2y ago[deleted]
- fzyzcjy 2y agoYou are welcome, and I am happy to see it helps! When I initially develop flutter_rust_bridge, my personal usage scenario is quite similar to yours: using Rust for some high performance algorithms.
- sbt567 2y agoWell done! I've heard only good things about rust_flutter_bridge. Some questions though (more like flutter question), how bloated flutter is (i.e. final app size) compared to mobile native (Java, Swift?) for simple app? And how's the UI performance looks like?
- fzyzcjy 2y agoFor app size, it depends on your specific scenario, because e.g. Flutter automatically removes library code that is not used. I remembered (but the memory is blur) simple app has something like ~5MB. Btw remember to split .so file per abi. For UI performance, I personally find it quite good, and Flutter(Dart) is compiled to assembly code via AOT (instead of e.g. JIT or interpreted), which theoretically speaking is also fast. For both, I would suggest to make a demo for your specific case to have more accurate results. Also I guess ask/discuss on the Flutter community may help.
- bubblebeard 2y agoCommendable effort! I’m currently using Tauri for a project myself and was wondering if anyone has any pros/cons between the two?
- fzyzcjy 2y agoThank you! I heard some people saying that, for apps using JavaScript, Tauri is replacing Electron and is popular nowadays, since Electron is very widely used. It seems Tauri cannot let Rust communicate with JavaScript very seamlessly yet, e.g. https://tauri.app/v1/guides/features/command/ https://tauri.app/v1/guides/features/command/ seems to have mainly basic features. oneshtein mentioned below that Tauri does not support mobile as first class citizen yet as well. Looking forward to seeing Tauri's bridge to improve and supporting mobile better in the future!
- bubblebeard 2y agoThanks for the info! I will keep an eye on this for future projects, keen to try it out. I’m currently working on a project being converted from Electron to Rust/Tauri. I recall Flutter being discussed, but our frontend dev was more comfortable with React.
- fzyzcjy 2y agoYou are welcome and looking forward to it!
- bobajeff 2y agoFrom what I can tell. I've not used Tauri and it's been years since I've tried flutter. Tauri currently has poor support for mobile and Linux (because of the state of WebkitGtk). Flutter uses Dart which is not widely used for anything else. Harder to learn as there is no MDN, w3schools or standard spec for it. Also Flutter Web has issues due to it's use of Canvas over the DOM. IMO, electron is still the way to go for cross platform apps.
- jurschreuder 2y agoIsn't Flutter basically a way to use the C++ render engine from Chrome, with a "scripting" language most similar to Kotlin and Swift? Why not just use the Chrome render engine directly from Rust? Why all the extra steps?
- polyaniline 2y agoThere's too much infrastructure on top of the render engine to replicate. Flutter is backed by Google and has a fairly large ecosystem of community packages. See Freya - which uses Skia - the render engine Flutter used until a while back.
- ThePhysicist 2y agoThey used to be based on Skia but now they have their own renderer (Impeller). That said rendering is only a small part of a UI toolkit, there's a ton of other stuff e.g. how to interact with system libraries, integrate with UI paradigms (e.g. tray icons, gestures, responsiveness, widgets).
- imadj 2y ago> Why not just use the Chrome render engine directly from Rust? This is what projects like Tauri (in Rust) and Wails (in Go) are doing[0][1]. Utilizing Webview to develop applications, but they still don't support mobile, Tauri mobile is in beta. Basically Tauri and Wails are on one side (HTML/CSS) trying to approach cross platform by supporting mobile platforms, while Flutter and Kotlin Compose Multiplatform started from the other side. So it depends on your needs, web-first or mobile-first, and what platforms matter to you. So far Flutter is in the lead offering the most polished experience when it comes to supporting all platforms (Web, desktop, iOS, Android). [0] https://github.com/tauri-apps/tauri https://github.com/tauri-apps/tauri [1] https://github.com/wailsapp/wails https://github.com/wailsapp/wails
- pjmlp 2y agoMuch better than reaching out to Chrome shells or Web widgets, kudos for the effort.
- fzyzcjy 2y agoThank you!
- selfmodruntime 2y agoFlutter Rust Bridge is without a doubt the best FFI bridge I‘ve ever used. It works like magic. I have no idea how it‘s done.
- fzyzcjy 2y agoThank you!
- webprofusion 2y agoCool, but the point of having stuff in Rust is to ideally have everything in Rust, or you're by definition not getting all the safety benefits of Rust.
- ramon156 2y agoWhile dart is definitely not like rust, dart is a very safe language. I'd love a dart+rust project if the package ecosystem wasn't such a mess in dart
- jenadine 2y agoDart is also safe.
- mtizim 2y agoNot at all, pretty much all popular languages (except C/C++) are as safe as (safe) rust. The only safety rust brings to the table is memory safety, which most languages achieve with a runtime and a garbage collector, which have a performance tradeoff.
- CryZe 2y agoYou definitely also get a lot more thread safety out of Rust than most languages.
- wongarsu 2y agoIn three most narrow definition of safety I agree. But that's a very narrow definition. Rust does offer a lot more: - no undefined behavior - many classes of concurrency bugs prevented by the type system - standard library and much of the ecosystem makes invalid states unrepresentable. E.g. a String is always valid UTF8 Those are things that are true to varying degrees for other languages. Dart does pretty well imho. But for example Java and C# offer memory safety but have very unsafe concurrency
- pjmlp 2y agoRust's concurrency is only safe in the very specific use case of threads trying to access common resources on the same memory space. It does nothing to prevent data races between processes, or concurrency errors between threads accessing resources that are external to the process. Scenarios quite relevant in distributed systems.
- nu11ptr 2y agoI use Flutter for my desktop UI and Rust for my backend. However, I chose to separate the two using gRPC instead of the bridge. This allows me to be agnostic of language on both sides and I suspect gives me a cleaner interface for mocking the backend from my frontend. It also makes it easy to place the UI and backend on different machines giving a true client/server architecture. The con is likely that the interface is probably more verbose, however.
- nevi-me 2y agoDo you run a gRPC service on the desktop where the UI runs, and connect the 2 via localhost?
- mdhb 2y agoNot op but I’m developing an application with this exact approach as we speak, although my backend code is in Dart also. You can also do gRPC over Unix domain sockets too if you’re sticking with desktop but overall I really like this approach as it makes it trivial for me to move from desktop app to web app with only some minor config changes.
- leononame 2y agoHow is the dart backend story? I've not heard much about people using dart on the server, are there mature frameworks out there?
- mdhb 2y agoI love it personally and with gRPC I don’t really have much of a need for any kind of backend framework at all. I just follow the guidance at aip.dev and raw dog it using language primitives for the most part.
- nu11ptr 2y agoAs one option, yes, the other option is to run them on different machines. App isn't done yet but the idea is that you are presented an option to either connect locally (if localhost detected) or remotely via auth on UI startup.
- BodyCulture 2y agoHow is the a11y story with this? I did not find any info about it in the document, but I can not imagine anyone releasing a GUI kit in 2024 without extensive a11y support, so why not mention it?
- nsriv 2y agoDo you mean in Flutter generally? I'd say it's very good, easy to build in on widget by widget basis, very easy to check and rest when running builds.
- cannibalXxx 2y ago[dead]
- danielvaughn 2y agoNice, I really enjoyed Flutter's approach to building UI, but I didn't really care for Dart all that much. In theory shouldn't it be possible to create a programming language specifically for UI? Something that can be interfaced with from any major programming language. Kinda like protobuf with its IDL format, but instead of defining data, it's declaring user interfaces. Is that a crazy or stupid idea? QT and XAML come to mind, but I believe QT is closed source (might be wrong about that), and XAML seems to have been dead in the water for a long time now (also might be wrong about that).
- Zelphyr 2y agoI’m curious what you don’t like about Dart? I thought I wouldn’t like it but I’ve found it surprisingly nice.
- danielvaughn 2y agoI don't have any well-considered opinions about it, moreso that on a gut level it felt like java or c#. It was a while ago that I tried it, and I can't recall the exact details.
- virtualwhys 2y agoOff the top of my head: 1) Types on the left 2) Statement, not expression, based 3) No privacy modifiers (aka, underscores everywhere) 4) required semicolons 5) no language support for json (de)serialization, or, json boilerplate everywhere (yikes) I've tried to get into Flutter 3x now, and each time Dart has defeated me. Flutter is quite good though, so take the good with the bad, I just can't stomach Dart (yet).
- satvikpendem 2y agoI've used lots of languages and those are fairly minor things. For example, I use Rust as well as Dart and just, "types on the left" is seriously an issue? In Dart 3 as well, many statements are now expressions, like switch and if/else, and in some cases, for. For something like JSON serde, Dart will have it soon via macros [0], just like Rust's serde macros. Sounds like you just need to build something you want to build and you'll get used to the language naturally. For me, the utility of Flutter and making cross platform apps outweighs Dart, and anyway, it is quite nice now with Dart 3. [0] https://dart.dev/language/macros#use-the-macro https://dart.dev/language/macros#use-the-macro
- api 2y agoThe sample with Google's IMHO ugly material design plus confetti is not the best look.
- sydbarrett74 2y agoDoes anyone know if Google plans to sunset the entire Flutter framework over time? Since they fired just about everybody internal who was working on it, I don't have a lot of confidence that Flutter will still have any Google support in 3-5 years. Has anyone talked about forking it and putting it under an independent foundation to ensure its long-term viability? Given Google's track record of long-term support for its various technologies, it would be a shame if Flutter got consigned to history's scrap-heap prematurely.
- mdhb 2y agoWhat the fuck are you talking about? This literally never happened.
- satvikpendem 2y agoWhat? No one in the Flutter team got fired. The only ones who potentially had something to do with it were people on the Google Cloud team that ran the pipelines for Flutter builds, but even then, they didn't directly work on Flutter, and their roles just got outsourced anyway to Europe, so it's not like Flutter itself was actually affected.
- the__alchemist 2y agoDoes anyone know how this compares to EGUI in terms of performance, binary size, flexibility, and overall experience?