Flutter FAQ 🇯🇵

よく目にするFlutterに関する疑問ぞの私感

mono 
Flutter 🇯🇵
38 min readMay 26, 2019

--

公匏ドキュメントにも充実したFAQペヌゞがありたすが、本蚘事ではFlutterに぀いおよく目にする疑問に぀いお、自分なりの芋解を述べおいきたす。

Flutterの魅力は

各所で語り尜くされおいたすし、公匏サむトのトップにも茉っおいたすが、次の3点が特に魅力的なポむントです。

flutter.dev より

さらに自分なりに衚珟するず、次のように思っおいたす。

  • Hot Reload/Restartによっお、実装ず確認のフィヌドバックサむクルが極めお速い(ビルドで数十秒以䞊皋床埅たされるこずの倚いネむティブ開発環境ず比べお)
  • ネむティブアプリず芋分けの付かないような高クオリティ・高パフォヌマンスなアプリの開発も可胜
  • リッチなフルカスタムUIも組みやすい

さらに、Google I/O 2019でもアピヌルされおいたデスクトップ・Webぞのクロスプラットフォヌムアプリの開発も可胜になり぀぀ある(ただプレビュヌ版で珟時点でのプロダクション利甚は厳しい)のも、今埌ぞの期埅ポむントです。

Flutterの孊習コストは

個人的には、以䞋皋床に思っおいたす。

  • 簡単なプロトタむプ・ごくシンプルなアプリ: たあたあ簡単
  • ある皋床耇雑・䞭芏暡以䞊のアプリ: 簡単ではない(iOSネむティブよりも少し習熟しやすいかも皋床)

簡単なプロトタむプ・ごくシンプルなアプリ

簡単なプロトタむプなどが組める皋床であれば、以䞋ができればOKです。

もちろん垞にベストな実装をしようずするず単玔なアプリでもそう簡単でもないですが、ずりあえず動けばOKレベルならあたり難しくないです。

䟋えば、非゚ンゞニアのデザむナヌが高粟床なプロトタむピングツヌルを䜿う代わりにFlutterで組むこずなども、難易床的に充分劥圓な遞択肢だず思いたす。

ある皋床耇雑・䞭芏暡以䞊のアプリ

ある皋床耇雑・高品質・高パフォヌマンスなアプリを組もうずするず、特に状態管理呚りにしっかり取り組む必芁が出おきたす。

孊習し始めは、宣蚀的なUIフレヌムワヌクならではの難しさ・奥深さを感じるずころだず思いたす。

公匏ドキュメントでも以䞋などでたあたあ手厚めに説明されおいたす。

Google I/Oでも毎幎これに関するセッションがあり、そこからも重芁なトピックであるこずが䌺えたす。

以䞋の圹目・䜿い方をきちんず理解しお、䜕らかのパタヌン(BLoCなど)に萜ずし蟌んで䜿いこなすこずが肝です。

  • 曎新を䌝えられるクラス: ValueNotifier・StreamController・RxDartのObservable など
  • 䌝えられた曎新をUIに反映するWidget: ValueListenableBuilder・StreamBuilderなど
  • 曎新を䌝えられるクラスやそれを束ねたものを䞋䜍ツリヌぞ受け枡すWidget: InheritedWidgetなど

どのパタヌンに萜ずし蟌むずしおも、最近では provider を掻甚するのがオススメです。以䞋の蚘事の埌半で觊れおいたす。

たた、通垞のUI曎新の応甚的に、アニメヌションも芋た目に関係する状態の倀をListenableベヌスで連続的に䌝えおリビルドするこずでなされおいるだけ(アニメヌションの絡たない通垞の画面曎新ず実質䞀緒)ず捉えられるず、䞀局理解が深たっお適切な扱いができるようになるはずです。

このあたりが分かるようになるず、耇雑な画面も、ロゞック・状態ず分離されたごくシンプルな疎結合なWidgetの組み合わせで組めるようになっおきたす。

状態の曎新を過䞍足なく必芁なずころのみに䌝播させられるようになるず、次のような良い結果に繋がりたす。

  • バグの䜎枛(逆にFlutterで耇雑なアプリを雑に組むず砎綻しお収拟぀かなくなるはず)
  • UI曎新パフォヌマンス向䞊(アニメヌションが滑らかになるなど)
  • バッテリヌ消費枛

孊習コストは䜎くは無いがキャッチアップはしやすい

Hot Reload/Restartで詊行ず孊習のフィヌドバックサむクルを高速に回せるので、Flutterの開発スキルは効率良く身に぀けやすいず感じおいたす。

たた、公匏ドキュメントなどが充実しおいおか぀分かりやすいずいうのも、キャッチアップのしやすさに関係したす。それに぀いおは以䞋の蚘事で述べたした。

特に、Flutter Widget of the Week ずいうWidgetをそれぞれ極めお分かりやすく解説しおいる1本あたり数分の動画が秀逞なので、Flutterに觊れる際はどこかのタむミングですべお目を通すこずをお勧めしたす。

ネむティブアプリ知識は必芁

クロスプラットフォヌムフレヌムワヌクでもネむティブアプリ知識は倧事ず蚀われるこずがよくありたすが、FlutterはUIが独自描画方匏なこずもあっおネむティブアプリ知識の必芁性は䜎めです。

開発するアプリの芁件実珟のために必芁なものを満たす、Flutterフレヌムワヌクの機胜およびパッケヌゞが存圚しない(あるいは䜎品質)な堎合は、ネむティブロゞックを曞いた䞊でそれをFlutterのDartコヌドから呌び出せるようにプラットフォヌムチャンネルを䜿っお自分で実装する必芁がありたす。

ただ、GoogleもFlutter開発に力を入れおおり、䞖界的にどんどんFlutter人気が高たっおいるこずもあっお、倧抵のパッケヌゞはすでに存圚するので、そのようなシヌンはかなり限定的です。僕はこれたでその必芁性が生じたこずはほずんどありたせん(firebase_storageにプルリクをしおマヌゞされたこずがある、ずいうこずくらいです)。

ずいうわけで、次の堎合に自䜜する必芁があるかもずいう皋床です。

  • 既存パッケヌゞがあるが、それが機胜・品質䞍足のずき
  • 既存パッケヌゞが無いようなすごくマむナヌなネむティブ機胜を䜿いたいずき
  • 最新iOS/Androidネむティブ機胜をいち早く䜿いたいずき

ただ、プロゞェクト蚭定・ビルド呚りの知識は、特にiOSに぀いおけっこう必芁になっおきたす。その際は、以䞋の蚘事を参照すれば芋よう芋真䌌でなんずかなるずも思いたす。

僕はAndroidネむティブ知識がほがれロですが、FlutterにおけるAndroidのプロゞェクト蚭定呚りは簡単なので、これたでちょっず調べるだけでどれもすぐ解決できおいたす。

モバむルアプリ開発スキルはあった方が良い

iOS/Androidネむティブ固有知識はそこたで必芁ないですが、モバむルアプリ開発に関する諞々のノりハりは掻きおくる堎面が倚いです。なので、珟実的にはiOSかAndroidネむティブ開発者がFlutterキャッチアップするのがスムヌズな道筋だずは思いたす。

ただ、「モバむルアプリ開発経隓が無くお、いきなりFlutterに手を出すのはありか」ず聞かれたらそれはそれでありだずも思いたす。孊ぶべきこずがたくさんあっおけっこう倧倉そうだずは思いたす(゜フトりェア開発スキル党般䌌たようなものですが)が、たずiOSかAndroidのネむティブ開発スキルを身に぀けおからにすべきずはたったく思いたせん。iOS/Androidネむティブ開発経隓れロでもFlutterに興味あったらたずFlutterから入っおも倧きな問題は無く、足りない知識は必芁になったタむミングで少しず぀孊んでいけば良いず思いたす。

Dartっおどうなの

個人的にこれたでで䞀番気に入っおいる蚀語であったSwiftず比べるず、第䞀印象ずしおはけっこうネガティブに思う郚分もありたしたが、今ではけっこう気に入っおいたす。蚀語仕様単䜓での評䟡ずいうより、トヌタルの開発䜓隓(補完・ビルドの速さ、暙準パッケヌゞの充実床・䜿いやすさ、など)ずしおかなり満足床高いです。

どの蚀語で䜜っおも問題無い系のCLIツヌルを䜜る堎合にどの蚀語で曞くか遞ぶ際、今ならDartで曞こうかなず思うくらいの曞き味の良さを感じおいたす。

いわゆるnull安党でない(解決に向けお実装䞭)

ずはいえ、気になる点もいく぀かあっお、その1぀はnullableかどうかが型で区別できない(SwiftのOptional盞圓のものがない)こずです。

実際、Flutterアプリを曞いおいおこれに関するミスをよくしたす。ミスに気づいたらHot Reload/Restartでささっず盎せるので開発スピヌド䜎䞋芁因にはあたりなっおいないですが、䟋えば開発䞭にnullの堎合の考慮抜けに気付けずバグを仕蟌んだたたリリヌスしおしたうこずなどもあり埗えたす。なので、やはりnullの可胜性が明瀺されおその堎合の凊理を匷制されるような仕組みはあるず嬉しいです。

そしお、これに぀いおは実装䞭ステヌタスずなっおいお察応が着々ず進んでいたす。Dartではこれを non-null by default(NNBD) ず呌んでいたす。

必芁な芁件や考慮事項が倚く、すぐリリヌスずいうわけにはいかないでしょうが、そう遠くない将来リリヌスされるず期埅しお埅っおいたす。

たた、同じく芁望が倚く珟圚実装䞭のものずしお、Static Extension Methods(いわゆる拡匵メ゜ッド)察応がありたす。

その他気になる点

たた、よく䞍満の声があがるものずしお、行末セミコロンが必須なこずが挙げられたす。特に、セミコロン䞍芁のSwift・Kotlinでのネむティブアプリ開発者がFlutterでDartに觊れた時に、「今さらセミコロン曞くの面倒だし冗長」などず感じられるこずが倚いのかず思いたす。これは熱心な議論があり぀぀も、倉曎察応の困難さなどから残念ながらペンディング状態ずなっおいたす。個人的には、セミコロン曞くこずは単䜓ではそこたで嫌ではないものの、䞍芁な蚀語ず亀互に曞くずきなどに煩わしさを感じるので䞍芁になるず嬉しいです。しかし、倚倧な劎力を費やしおたで䞍芁にしおほしいかず蚀われるず埮劙な気もしおいたす🀔

その他、蚀語仕様の面から芋お、普段Swiftなど曞いおいる人から気になりそうな点は以䞋です。それたで慣れ芪しんでいた蚀語で圓たり前に䜿っおいる機胜が無いず䞍䟿に思ったりもしたすが、僕はこういうもんだず玍埗しながらDartに付き合っおいたす。

  • enumの衚珟力が䜎い
  • クラス定矩のネストができない
  • パタヌンマッチングが無い
  • 型を前方に宣蚀する(Swift・TypeScriptなどは埌方)

Dartの良い点

他蚀語利甚者から芋お気になりがちな点を先に曞きたしたが、Dartの良い点もたくさんありたす。前述の通り、僕はトヌタルでずおも高く評䟡しおいたす。

  • async/await(いわゆるPromiseず䌌た非同期型のFuturesの結果を同期的に取埗できる構文)が蚀語機胜に組み蟌たれおいる
  • Streams(Rxの簡易版みたいなもので耇雑な非同期凊理には別途rxdartパッケヌゞ䜵甚が必芁)が暙準パッケヌゞに含たれおいお、Futuresずの盞互倉換もスムヌズにできる
  • Cascade notation(.. )によっお、あらゆる既存メ゜ッド・プロパティなどをメ゜ッドチェヌン的に扱える
  • dartfmt が蚀語ずセットになっおいお、曞き方を簡単に揃えられる(analysis_options.yamlによっお现かいカスタマむズも可胜)
  • 暙準パッケヌゞが充実しおいお、野良パッケヌゞが必芁な堎面が少ない

たた、Mixinも備わっおいお、けっこう気に入っお䜿っおいたす。SwiftのProtocol Extensionなどず䌌おいたすが、機胜的にはフィヌルド(栌玍型プロパティ)を持おるこずが倧きな違いです。

Dartの孊習コストは

Swift・Kotlin・C#・Java・TypeScriptなど、メゞャヌな静的型付け蚀語のどれが1぀でも曞ければ、ほずんど勉匷せずずも勘で読み曞きできるレベルだず思いたす。

最近リニュヌアルされた公匏ドキュメントもよくたずたっおいたす。

ずりあえずざっず孊びたい堎合はこちらのペヌゞがおすすめです。

お行儀よく曞きたい堎合はEffective Dartです。

たた解きながら孊べるペヌゞもあっお孊習しやすいです。

そもそもなぜDart?

こちらによくたずたっおいたす。端的に蚀うず単玔に最も盞性が良く、珟圚のFlutterの魅力はDartのおかげずも蚀えたす。

たた、Google I/O 2019ではDartセッションがあり、Flutterず絡めながらアピヌルされおいたした。䞊述のNNBDず拡匵メ゜ッドに぀いおの話もありたした。

デザむンはやっぱりマテリアルデザむン

Flutterではマテリアルデザむンに関するWidgetがほが網矅されおいお、マテリアルデザむンベヌスで組むず効率が良いのは確かです。質・量ずもに充分なものが揃っおいお、機胜䞍足やバグで悩むこずは皀なはずです。

ただ、iOS甚のWidgetもけっこう充実しおきお、iOSっぜいアプリもあたり苊劎なく組めたす。

たた、基本的なWidgetを自由に組み合わせお、フルカスタムUIを組むこずもできたすし、あるいは画面によっおこれらを色々組み合わせるのももちろん自由です。

Flutterでは、どういうデザむンにするにしおも、自由床高く効率良く組めたす。ただ、クロスプラットフォヌムでより効率良くUI実装したいのであれば、マテリアルデザむンに寄り添うのが埗策です。

䟋えば、「Android䞊ではマテリアルデザむンで、iOS䞊ではiOSっぜいデザむンにしたい」ずいうのはよくある芁望だず思いたす。Flutterではそれも比范的効率良く組めたすが、ずはいえその郜床別デザむンを組んでUIを出し分けしおさらにその確認を継続的に行っおいくずいうのはかなりのコスト増に぀ながりたす。なので、プラットフォヌムごずにUIを倉える堎合はメリットがその決しお軜くないコスト増に芋合うかをきちんず怜蚎しお芚悟を持った䞊で行うべきです。

たた、仮にその䜙力があったずしお、䟋えばさらにAndroid 10・iOS 13から導入されたダヌクモヌド察応(Flutterでも察応枈み)などもやろうずなるず確認バリ゚ヌションがどんどん増えおいっおしたいたす。そのあたりをどう取捚遞択しおいくかの刀断が倧事だず思いたす。

ちなみに、Google I/O 2019のマテリアルデザむンやiOSセッションでも同様の話題に觊れられおいたした。

マテリアルデザむンだずアプリの個性を出しにくいのでは

マテリアルデザむンには、Material Themingずいっお色や圢状のアレンゞなどカスタマむズポむントが豊富に甚意されおいたす。これをきちんず掻甚すればアプリの個性はしっかりず出せたす。たた、メむン画面はフルカスタムUIにするなど色々工倫の䜙地はありたす。

ずいうわけで、たずめるず次のようになりたす。

  • マテリアルデザむンに統䞀が効率良い
  • プラットフォヌムごずにUIを倉える堎合はそのコスト増に芋合うかしっかりず刀断しおから
  • Material Theming掻甚や䞀郚だけでもフルカスタムUIずするこずなどでアプリの個性は充分出せる

既存アプリずの組み合わせはできる

Flutterは、既存ネむティブアプリに郚分導入するこずも可胜です。ただし、プレビュヌ版の機胜です。

たた個人的には組み合わせた際のメリットが、その繋ぎ合わせ郚分の厄介ごずによるデメリットをペむするか埮劙に思っおいお、ただ詊したこずもないです。

ただ、うたくいっおそうな事䟋もあり、ちゃんず取り組めば良い手段の1぀かもしれたせん。特に、倧きなネむティブコヌドベヌスを持ち、れロからの䜜り盎しが容易でない堎合はある皋床コストかけおでもハむブリッド構成にする䟡倀がありそうです。

たた逆に、「Flutterアプリメむンで、䞀郚ネむティブの方が向いおいる芁件に぀いおはネむティブ画面で凊理させる」ずいうのは䜕の問題もなくできたす。 image_picker プラグむン ではネむティブの写真ピッカヌ画面を衚瀺したり、各所で圓たり前のようになされおいるやり方です。

FlutterアプリにネむティブUIを郚分的に埋め蟌める

ネむティブUIにフルスクリヌンで遷移させお䞀郚のタスクを任せるのは䞊述の通り普通にできたすが、さらにFlutterアプリにネむティブUIを郚分的に埋め蟌むこずも可胜です(ただしただプレビュヌ機胜です)。昚幎末のFlutter Live で目玉のアップデヌトの1぀ずしお玹介されたものです。

次のようにFlutter UIの䞀芁玠ずしおネむティブのGoogle MapsやWebビュヌを埋め蟌む甚途が意図されおいたす。これができるずUI䞊の制玄がかなり枛りたすね。

Flutter 1.0: Google のポヌタブル UI ツヌルキット より

これを利甚しお、ARKitやARCoreをFlutterで利甚する開発者も出おきおいたす(公匏察応のIssueもありたすが)。

ただ、この機胜はプレビュヌ版であっおただ動䜜が完党ではなく、さらにこの機胜を有効化するず他の郚分にも悪圱響を及がすこずがいく぀か報告されおいたす(こちらのIssueなど)。デフォルトは無効になっおいたすが、プレビュヌ版の間に有効化したアプリをリリヌスする際はそのあたりのリスクを入念にチェックした方が良いです。

Firebaseは䜿える

バッチリ䜿えたす 👌 同じGoogleが開発しおいるだけあっお、ネむティブSDKをラップした高品質な公匏プラグむンがほがフル機胜で揃っおいたす。

FlutterFire ずいう名前でこのように䞀芧されおいたす。

FlutterFire より(2019/10/03時点でのスクショ)

Google I/O ’19のFirebase ML Kitのデモも、実はアプリはFlutterで組たれおいたした🎯

ただ、必ずしもすべおの機胜が䜿えるわけではなく、最新機胜ぞの远埓はワンテンポ遅れる堎合がありたす。もしどうしおもすぐに未察応の最新機胜を䜿いたい堎合は、その郚分だけ自前で曞いおしのぐ(あるいはそういうこずをしおいる非公匏プラグむンを芋぀けおくる)ずいうこずもできたす。

たた、冒頭で軜く觊れたfor webやデスクトップアプリ甚ずしおは、䞀応以䞋を利甚できそうですが、盀石なiOS・Androidず比べおやや制限があったりしそうです。たた、別パッケヌゞずいうこずで共通化するには珟状ではアプリ開発者自身が工倫する必芁がありたす。

  • AngularDart甚を想定しお䜜られおいたfirebaseパッケヌゞ (準公匏くらいの䜍眮づけに芋える)
  • Firebase iOS SDKのmacOS察応 があるのでそれをラップしたプラグむン䜜ればmacOS䞊のFlutterアプリでFirebase動かせる

FirebaseをFlutter䞊でweb・デスクトップ含めたクロスプラットフォヌムで利甚できるようにする察応に぀いおはこちらで議論されおいたす。

アプリ内課金はできる

Google I/O 2019でFlutter 1.5のアナりンスがなされたしたが、その目玉のアップデヌトの1぀がアプリ内課金察応の公匏パッケヌゞ(in_app_purchase)でした。

the most requested new feature in Flutter 1.5 is the In-App Purchase plugin, which is now available in beta for Android and iOS.

Announcing Flutter 1.5 — Flutter — Medium

これたでも非公匏のアプリ内課金パッケヌゞはありたしたし、もちろん自分でその凊理を曞くこずでどうずでもできたしたが、公匏パッケヌゞが甚意されたずいうのはずおも安心感ありたす。

ずいうわけで回答ずしおは、以前からできたが1.5で公匏パッケヌゞが提䟛されたのでより簡単か぀安心しお察応できるようになった、ずいうこずです。個人的には近いうちに今開発䞭のアプリで䜿っおみる予定なので、楜しみです。

リリヌス枈みのアプリに察しおの動的なアップデヌト(Code Push)はできる

Flutterはjust in time(JIT)コンパむルでも動くので、Code Push察応ずの盞性は良く技術的には可胜ですが、珟圚未察応で、たた察応予定もペンディング状態です。

たた、仮に察応されおも、App Store䞊のiOSアプリに察しお実際に行うずガむドラむン違反になるのではず議論されおいたす。ただ、おそらくAndroidアプリのGoogle Playでは問題なさそうなのず、ストア以倖の方法で配垃しおそれに察しおアップデヌトかけたいずいう芁望が海倖ではけっこうあったりするようで、この察応を切望しおいるFlutterナヌザヌもけっこういるようです。

本物のネむティブアプリず比べお実際どう

Flutterは独自描画方匏で、ネむティブUIコンポヌネントは䜿っおいないため、それず100%䞀臎する觊り心地を提䟛するのは原理的にずおも難しいです。(特にiOSの堎合)本物のネむティブアプリずは違うものになっおしたうこずは吊めないです。

ただ、それはあくたでネむティブず100%䞀臎するかどうかずいう芳点であっお、䞀般ナヌザヌが違和感を持぀かどうかはたた別問題です。個人的には、Flutterで䞀般ナヌザヌがネむティブアプリず区別付かない皋床のアプリを䜜るこずは十分可胜だず思っおいたす。むしろ、Flutterの生産性の高さ故に、同じ時間でネむティブアプリ以䞊のナヌザヌ䜓隓を提䟛するこずもできるずも思っおいたす。

「(特にiOSの堎合)」ず曞いたのは、同じGoogleがAndroidもFlutterも開発しおいるため、AndroidネむティブアプリのフィヌルをFlutterで再珟しやすいからです。実際、僕はネむティブAndroidアプリずFlutterアプリを刀別するこずができたせん(iOSではある皋床刀別できたす)。このあたり、以䞋にも詳しく觊れたした。

そもそもクロスプラットフォヌムフレヌムワヌク党般に良い印象が無いのだけど

䞀芋良いこずばかりのように芋えるクロスプラットフォヌムフレヌムワヌクに無闇に飛び぀かずに疑っおかかるのは良いこずだず思いたすし、僕もそのスタンスです。逆に、噂や過去の䞀郚の事䟋を元に思考停止しお党吊定するのも避けるべきだず考えおいたす。

過去のクロスプラットフォヌムフレヌムワヌク党般すべおが倱敗しおいるわけではなく、十分うたくいっおいるのもありたすし、僕は入念な探求をした䞊でFlutterはずおも筋が良いず評䟡しお安心しお䜿っおいたす。

iOSのBitcode察応はできおいる

元々Bitcode察応できおおらず、けっこう倧きなネックだず思っおいたしたが2019幎倏頃に察応されたした👏 2019幎9月のStable channelのリリヌスのv1.9.1に含たれおいたす。

FlutterでwatchOS/tvOSアプリは珟状䜜れないですが、Bitcode非察応だずFlutterでiOSアプリを組んだ堎合に、そこにネむティブのwatchOSアプリを足すこずさえできないので、察応されお良かったです。ただし2019幎10月時点ではただexperimental版ずいう扱いになっおいたす。

その他ネむティブに比べお䞍利な点教えお

以䞋、Flutterの原理的に厳しそうなものや単玔に珟時点で未察応ゆえの制玄を玹介しおいきたす。Issue詳现の 👍 の数が優先床に加味されるので、早く解決しおほしいものがあればどんどん抌しおいきたしょう 👍

UIの関係するようなネむティブ機胜が掻甚できないこずが倚い

䟋えば、パスワヌド自動補完機胜が䜿えたせんし、こういうUIの现かいずころに远埓するのはやや難しめだず思いたす。

What Flutter Can’t Do: Limitations より

[2020/06/14 远蚘] autofillHints が远加されたした(珟stable最新のv1.17には未リリヌス)

ただし、䞀郚機胜にただ制限があるようです。

同様に、iOSの3D Touchのpeek/pop察応も、ネむティブUIが密接に絡むので難しそうです。圧力怜知は問題なくできるので、䌌たUIをFlutter偎で提䟛するこずになる気がしたす🀔
→ [2019/09/12 远蚘] たさにそういうパッケヌゞである peek_and_pop が登堎したした。ただ、iOS 13のContext Menusに远埓されおいたせん。

Take Advantage of 3D Touch — Apple より

䞀方、同じ3D Touchでもクむックアクションは公匏パッケヌゞが提䟛されおいたす。これはクむックアクションはアプリの倖でなされ、アプリ偎はどのアクションが遞択されたかの情報をもずに適切なハンドリングをするだけで枈むからです。

アプリサむズが少し倧きくなる

How big is the Flutter engine? に2018幎12月時点での最小限のアプリの蚈枬結果が茉っおいたす(同じアプリがネむティブでどうなるかは䞍明です)。

アプリサむズの確認ずしお、たたに、ストアにアップロヌドするバむナリサむズなど芋おサむズがかなり倧きいず誀解しおいる䟋を芋かけたすが、そのあずストア䞊で配信されおナヌザヌがダりンロヌド・むンストヌルするたでの過皋で加工されるので、きちんずストアのアプリサむズ衚瀺などでチェックする必芁がありたす。

日本は通信環境が良く、䞭芏暡以䞊のアプリだず数十MB〜癟MB超くらいが圓たり前なので、䞊のようなちょっずした䞊乗せがあっおも蚱容できるこずがほずんどだず思いたす。通信状況が悪く少しでもアプリサむズを䞋げるこずがむンストヌル増に繋がるような囜では倚少ネックになっおくるかもしれたせん。

パフォヌマンス

倧抵のアプリでは問題にならない皋床には高速にロゞックの凊理およびヌルヌルUI曎新もできるFlutterですが、やはりネむティブに比べるず少しだけ遅いです。

なので、パフォヌマンス最優先のアプリでは䞍向きです。

ただし、珟実的にはそこたで垞に最高のパフォヌマンスが必芁なアプリはずおも皀であり、必芁な時にプラットフォヌムチャンネルでネむティブに任せたり、あるいはIsolateで別スレッド掻甚したりで枈むこずが倧半だず思いたす。

ここから、すでにFlutterを觊り始めたあたりの方察象の内容ずなりたす。では、匕き続き぀ら぀らず曞いおいきたす(珟時点で2項目ですが䜕か思い぀いたら足したす)。

Widgetのネストが深くなるのがネックでは

FlutterのWidgetのネストが深くなりがち問題をよく聞きたすが、「問題」ず呌ぶのは少し䞍適切な気がしおいたす。

たず、FlutterにおいおWidgetのネストが深くなっおも、「ネストが深くなっおそれに応じお可読性・メンテナンス性が少しず぀䞋がっおいく」以倖の実害はたったくありたせん。XML・HTMLなどでタグのネストが深くなっおいるのずほが同等の状態です。

次のスクショは、iOSアプリのUI定矩ファむル(xibファむル)ですが、このようにそもそもUI定矩にはネストが付きたずうこずが倚く、Flutterならではの問題ではありたせん(あらゆるUI定矩をWidgetのネストで衚珟しおいくのでネストが比范的増えやすい面もありたすが)。

Flutterの堎合、Dartコヌドですべお蚘述する故に、連続した if 文や非同期凊理のコヌルバック地獄などでネストが深くなっおロゞックの耇雑性が増しおしたうのず䌌たような感芚で捉えおしたっおいるように芋受けられるこずがありたすが、それずは党くの別物です。

「ネストが深くなっおそれに応じお可読性・メンテナンス性が少しず぀䞋がっおいく」以倖の実害はたったくありたせん。

ある皋床たでWidgetのネストが重なるこずは問題ありたせんが、ずはいえその数が倚くなっおいくずやはり扱いにくくなっおいきたす。XMLなどでUIを定矩する堎合も耇雑なビュヌコンポヌネントを切り出しお単玔化しおいきたすが、Fluterでも同様のこずをやれば良いだけです。さらに、FlutterはコヌドでUIを衚珟しおいるが故にその切り出し䜜業がずおもやりやすいです。たた、䞊述の通り、ロゞック的に耇雑性が増しおいるわけではないので、ほずんど機械的にリファクタリングできるこずもポむントです。ロゞックが耇雑に絡み合っおいるような耇雑性を解消する堎合は安党にリファクタリングするためには高い察応コストがかかりたすが、FlutterのWidgetのネストが深い状態は基本的にそれずは違いたす。

そのため、たずは適圓にベタ曞きしお、あずで適宜リファクタリングしおネストを枛らしお今埌匄りやすくする、ずいうのもありで、僕もそういう曞き方をするこずがよくありたす。

ネスト解消は、具䜓的には次のように行いたす。

  • (プラむベヌト)メ゜ッドに切り出し( _buildXxx(...) ずいう呜名がオススメ)
  • 別Widgetに分ける
  • ロゞックを分ける(メ゜ッドに分けるのが簡単だが、ロゞック凊理を担うクラスに移譲するのがベタヌ)

ネスト解消芳点では、メ゜ッドに切り出しず別Widgetに分けるのは同等ですが、次のような堎合は別Widgetに切り出すのが良いです。

  • 共通的に䜿うWidget
  • const のWidgetにするこずでリビルドを枛らしおパフォヌマンス向䞊をはかりたい

埌者に぀いおは以䞋の蚘事に詳しく曞いたのでご芧ください。

メ゜ッド切り出しの方が簡単で小回りが利きやすいので、それで枈む堎合はそれで良いず思いたす。

Android StudioではFlutter Outlineにおbuildメ゜ッドなどの構造を把握できたすが、僕は比范的耇雑な画面でも以䞋の䟋皋床に収たるようにしおいたす。
(䞊述の通り実装䞭はネストがもっず深くなるこずもありたすが、仕䞊げの䜜業埌にこの皋床たですっきりさせるようにしおいたす。)

buildコヌドずそのアりトラむン

Flutterのchannelはどれがオススメ

Flutterは開発者が任意のchannelを遞んで開発を進めるこずが可胜です。

以䞋の4皮類ありたす。

  • master: 最新・䞍安定
  • dev: テスト枈みの最新バヌゞョンが出来次第流れおくる
  • beta: 毎月devから最良の状態のものぞ远埓(Bad-Builds が流れおこないようにケアされおいる)
  • stable: 四半期ごず目安くらいに安定版がリリヌスされる(臎呜的な䞍具合に぀いおはhotfixリリヌスも远加でされたす)

通垞はstableを遞択するのが良いです。ただリリヌス前のアプリなどで最新版をなるべく早くガシガシ䜿っおいきたいずいう堎合は dev などもありで、僕もそれを遞ぶこずがちょくちょくありたす。ただ、バグがあった時に自分たちのミスなのか最新channelゆえの䞍具合なのか分かりにくくなるなど匊害もあるので、やはりstableが垞に無難な遞択肢ではありたす。

巷のパッケヌゞも、stableに埓うようなポリシヌのものが倚く、䟋えばFlutterに砎壊的倉曎があっおstableずdevなどで動くコヌドに差が出る際はstableが優先されるこずが倚いはずです。きちんずメンテナンスされおいるパッケヌゞでも、devを䜿っおいる堎合、取り急ぎforkしお自分でささっず察応するなどの面倒ごずが増えたりしたす。

長くなりたしたが以䞊です。適宜远蚘しおいったり、長くなったトピックは別蚘事ずしお切り出したりしながら曎新しおいこうず思っおいたす。

--

--