Xamarin、旗色悪いなぁ。
最近思った事です。
.net coreもあれ以来あんまり食指が動かないですし、XamarinはAndroidXに対する対応がグダグダだったり、新しい事がしづらくなっています。
Androidのネイティブ開発でのkotlin化が進むに連れて、悪化してる雰囲気ですね。
あと、僕の環境はVS2017なので、VS2019を要求されると自宅で腰を下ろしてしか学習できないという結構な障壁があります。
お昼休みは自己学習する時間にしているので。。
なので、しばらく前から新しいAndroidアプリ開発環境を考えていました。
もともとガワネイティブを推したい側としては、PWAなんかも一つの選択肢として考えていたりしたのですが、やっぱりネイティブの機能は使いたいのと、Webアプリだとユーザデータを預からないといけなくなってしまう、なんていう理由があったりで、ちょっと食指が伸び切らない感じでした。
かといってkotlinで開発するのは嫌というか、抵抗感があります。
そこに、最近よくお話をしている方が、React Nativeをバリバリ使っておられて、自分も再度使ってみたところhooksなんかで相当使いやすくなってると思いました。Hermesも期待大です。
React Nativeいいじゃん、このままReact Nativeで行こうかな、と思ったときに、先日の記事のようにDartの2.6のニュースを見ました。シングルバイナリなAOTだと!? と言う事で、かなりDartに引き込まれていたところで、当然と言うがごとくFlutterに出会いました。
使ってみた感想としては「Flutter、いいじゃん」です。
もともとDartが相当いいセンスしてる言語な部分があり、その上で、UIがコードで書ける、ホットリロードがめっちゃ早い、アプリもぬるぬる動くという凄さを感じましたね。
何よりも凄いと思ったのはUI要素を自前で描画しているところです。
Unityをお仕事で使っていますが、Unityで本当に強いのは移植性です。どんな環境でも画面はしっかり出ます。
一番のネックのコントロールまで自力描画というのは、フレームワークにも無理させてる気はしますがやっぱり強い。
各プラットフォームでの挙動の差異(テキストをダブルタップ後ドラッグすると選択範囲が変わるみたいな細かい部分まで!)まできっちりハンドリングしてる所が気に入りましたし、古い端末でもあたらしいUIが使える点も強いです。
※実コントロールをうまく制御する方法だと、古い端末でうまくいかなかったり、新しすぎる端末で不具合出たりいろいろ悲しいことが起こります。
また、マテリアルデザインに特化してるので、デザインに悩んだときは思想を合わせられます。もちろん好き勝手にレイアウトもできますが。
さらにそのコントロールはReactのように差分描画。強さしかないですね。
悩むところなので、個人開発してるアプリの最小限の機能を実装したものをReact Native、flutterで作って比較してみることにしました。
結果は冗長になりますので、ポイントだけ。
abiごとに書き出すとRNとFlutterは少しだけFlutterのほうがサイズ大きいけど、Xamarinから見たら誤差の範囲なぐらい。
開発効率はReact Nativeの方が最初は早かったけれども、Flutterに慣れるにつれてどんどん差は縮まった。(※どちらも良い感じに早いです)
ライブラリは圧倒的にRN。本当に圧倒的に。
画面描画はFlutterの方がヌルヌル。
と、なかなか評価の分かれる結果になりました。
将来的にiOS対応を考えるなら、Xamarinではなく、上記どちらかを使いたいと思ってます。
デスクトップアプリの作りづらさとしては、Flutterが数歩劣る感じですね。
RNはReactであればElectronで動かすことも出来ますし、Xamarinは画面の作り直しさえ許容できればDLLを使い回すことも出来ました。
Dartだと、現状最大限頑張ってCLIしか出来ないので、ラッパーアプリをつくってあげる必要があります。
とはいえ、最近自分がGUIアプリをほとんど必要としなくなったので、CLIアプリとしてだけ提供であれば、Dartの方が良いかもしれません。
nodeのアプリはもちろんnodeが要るのと、node_modulesのインストールが面倒なので。
今後もっと触っていきたいですね。両方とも。