Hacker News new | past | comments | ask | show | jobs | submit login
Alibaba Puts SDK Flutter to the Test (hackernoon.com)
52 points by hliyan 5 days ago | hide | past | web | favorite | 34 comments

Found this while evaluating options for moving away from React Native (which is not really working well for us). As much as I love Flutter/Dart, the big problem: most of our users are on iOS, and Flutter being a Google project, seems to prioritize Android over iOS (RE: UI polish and runtime performance). Looks like we'll be sticking to native dev for a while...

My view is simply that native is practically always better - if you have the resources to maintain two codebases. The biggest risk I see is that you're running two separate development teams (Android and iOS) with varying skills.

On our last project, the Android code was of much worse quality than the iOS one (perhaps due to both tooling and Java null pointers; which can be attributed to poor development skills), so the projects did not match in terms of quality and sometimes even the way features behaved.

What sort of issues have you been running into with RN?

As of late, the spit and polish for React Native on Android has been getting better, with some features even being exclusive to Android here and there. Though personally I am super interested in Fabric, if they really do make native calls as easy and performant as they say they will it will make RN dramatically closer to native platform development.

Possibly unfair to point the finger at RN here, but we found that the amount and complexity of code involved in developing using RN + JS + Redux was much higher than when just using Swift (< 50%). We've yet to repeat the experiment with Android/Kotlin, but I'm confident we'll get similar results.

IMO, every attempt thus far has approached cross platform entirely the wrong way. They’re all way too focused on providing deeply custom UI. I believe that it may better to instead abstract app navigation as its own separate thing, making it a setting in a config file (e.g. tabbed, hamburger, split-pane tabbed, etc) and restricting UI coding to individual screens, which would have style hinting abilities and could be built via any number of platform agnostic (and perhaps language agnostic) ways. All this would then compile down to native UIKit, Android SDK, UWP, AppKit, etc.

So the idea would be you program your app’s individual screens, throw in some styling, select platform appropriate nav schemes (hamburger for android and tabbed for iOS for example) and hit compile to generate native per-platform project files+code.

This sort of solution wouldn’t cover more complicated navigation schemes or use cases that actually require highly custom UI, but if you’re doing either of those you’ve probably outgrown any kind of cross platform solution anyhow. Realistically I believe this would work well for probably 80-90% of non-game apps and wouldn’t suffer many of the drawbacks that usually come with “silver bullet” style cross-platform setups.

Or you could abstract out the model, networking, persistence, and other services logic from your app into a reusable library,—and then consume that from a native, unshared frontend.

I'm hoping that Swift becomes sufficiently viable on Android that I can reuse library code across iOS and Android sometime in the next few years.

This is much what Xamarin does, encouraging you to have a common core, and then implement the UI for each target platform separately to fit the platform’s style.

Looks like Kotlin gets the lead in this area with Kotlin Native.

Jetbrains moves pretty fast and the integration works surprisingly well for something this young.

As great as jetbrains is, I think Swift has much better long term potential in terms of FOSS tools. The Swift language server Apple is currently working should bring an open tooling avalanche.

In fact I think the high quality of jetbrains IDEs might actually impede Kotlin tooling development… why bother when first party tools are so good?

The thing is, developers outside of Apple platforms don't really adopt Apple techs. Objective C never took off and the same seems to be happening to Swift. I don't know anyone using it on Linux.

Objective-C’s cross platform use was crippled due to half of its essentials being tied up in Cocoa. Objective-C by itself doesn’t even have memory management.

Swift doesn’t suffer this issue — it’s been built for multiplatform use from day 1. There are still some discrepancies, but today Swift on Linux is about as usable as Swift on Apple platforms. There’s even several (4+ last I checked) modern web frameworks for Swift and even GTK+ bindings.

On top of this, its Windows port recently reached a useable state and there’s work being done on a Win32 bindings. Once that’s done, it will be possible to write an app with a common core and 3 different UI layers all in Swift which connects to a web API written in Swift. That’s already leagues beyond what was ever achieved with Obj-C and momentum is continuing to build.

Ok. But the questions now is: why would you adopt it?

You could use Java/OpenJDK or even Kotlin/OpenJDK.

You could use dotnet core.

You could use Node.js with Typescript.

Or Python/Ruby/PHP/...

All those are mature and support all major operating systems way better than Swift does.

I'm not sure what Swift's Unique Selling Proposition is. From where I'm looking it seems to be: "it's backed by Apple".

> Swift on Linux is about as usable as Swift on Apple platforms

Eh, I wouldn’t say that. I don’t see it significantly ahead of say GNUstep is for Objective-C; Swift on any platform other than macOS is still pretty much a second-class experience.

I consider a big mistake that Kotlin/Native doesn't share the same semantics with pure Kotlin.

However since it is still beta, this might eventually change.

And it does require getting licenses for Clion and AppCode, for the full developer experience regarding Kotlin/Native, versus C++ that is already there in XCode and Android Studio.

Have you attempted cross platform development with Kotlin [1]? If so, how is your experience?

[1] https://proandroiddev.com/we-built-our-ios-and-android-apps-...

Yeah, that wouldn’t be too bad. The main need when doing something like this would be a networking library that uses system provided networking (NSURLSession, etc) under the good rather than curl or something like that — not that curl or whatever else is bad exactly, but you’d be losing out on radio use optimizations among other things.

> abstract out the model, networking, persistence, and other services logic from your app into a reusable library,—and then consume that from a native, unshared frontend

Oddly enough, this is what we're going with...

I’d suggest using C++ or a language with C bindings if you want this today (or even in the future).

And then I’d have to write C++. No thanks :-/

That is exactly what Office team and Dropbox are doing with their mobile apps.

Microsoft used the term hamburger development at their CppCon presentations, with the meat being the C++ code and the bread for the native glue and views. :)

Naturally one can use something else other than C or C++ for the library code, but then there is the additionall effort of adding yet another toolchain and debugging layer into the process.

You can do this with Flutter. Flutter provides two packages for ui: material and Cupertino. But you an make your own package using Flutter. This is something I'm doing right now in fact.

Unless I’m mistaken, the Cupertino package isn’t using real UIKit controls… they’re just Flutter controls skinned to look like UIKit and drawn to an OpenGL context. My proposed solution is built to use actual UIKit under the hood on iOS.

Flutter’s “Cupertino” theme is poor facsimile of native UIKit controls.

I rather go with mobile Web for apps that should be web sites to start with, or native views with C++ business logic.

Do you have any concrete examples of the effects of this "prioritization" or it's just speculation? I use Flutter almost exclusively for iOS and I haven't seen any difference in development or user experience so far.

UI polish and runtime performance, as I've mentioned. I said "seems to" because I only see the effects: the Cupertino widgets, and the marked performance differences on Android and iOS (see the Alibaba article). I don't know whether this is purposeful or a side-effect of something else.

Here's another performance comparison (2018). It compares Flutter to native iOS app. Flutter consumes 2x more CPU and memory for an app with 60fps rendering.


Flutter has had a lot of performance improvements since that date. It'd be great to see that updated compared to current version

Correct me if I'm wrong. But it's possible to mix native with some Flutter + RN for laying out views right? I'm pretty sure that's what Instagram does (mainly in Obj-C but some views are in RN) and Snapchat (Flutter). Doing this would make sense when running apps on both platforms yea?

How does this compare with the new RN architecture coming in? Does anyone know what kind of gains we can expect?

It is quite unfortunate no one cares about the Android on iOS monstrosities this framework creates.

what about nativescript?

I was just looking at NativeScript and would love to hear about experiences developing production apps with it.

We have a pretty large javascript web app code base and have built both native and React Native ports. Both of which have had more cons than pros for us. So we ship on mobile as a web app.

The holy grail for us would be to use our javascript library code underneath native UIs (that we write ourselves) for both iOS and Android.

Just try it.. it's great

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact