Flutterエンジニアがネイティブ学習で困ったこととその乗り越え方

目次
1. はじめに
AndroidでUIをXMLファイルによって設計する方法や、iOSのStoryboardの操作、さらにはKotlinやSwiftといった言語の違いなど、すべてが新鮮で同時に大きな課題となりました。
2. UIの構築: レイアウトはどこで作る?
まずは概念を知る
- Androidでは、XMLファイルでレイアウトを作成し、そこで定義したUIのIDをネイティブコードから呼び出して処理などを実装する。
- iOSではStoryboardを利用してレイアウトを作成し、それをSwiftコードとツール上で紐付けて処理を実装する。
UIを作ろう
Android
decoration: BoxDecoration(border: Border.all(color: Colors.grey))
iOS
例えば、Auto Layoutが崩れてしまうと、Storyboard全体に様々なエラーが発生してしまうので、ボタン1つ移動するだけでも慎重な操作が必要でした。
3. タップイベントの実装: タップしたいだけなのに
タップイベントを実装しよう
Android
ですが、「setOnClickListener」と書かれている部分を見れば、一目で「タップ処理を付けている」ということが理解できる仕組みになっており、構造を把握して慣れてくると、読みやすさを感じる場面も多くなりました。
UIとロジックが分離しているネイティブのアプローチは、処理分担が明確になるというメリットもあると思います。
iOS
具体的には、Storyboardでボタンなどイベントを付与したいUI要素を作成した後、ViewControllerで「@IBAction」を利用してドラッグで紐付けるだけで簡単にアクションを付与できます。
さらに、ViewControllerのコード側から「どのUIコンポーネントと繋がっているか」を確認することが簡単に行えるだけでなく、その逆(Storyboard側からViewController)も分かりやすい仕組みになっています。これにより、レイアウトとロジックが分離されていても、その関連性を視覚的に確認できるため、初学者でも操作しやすくなっている点がありがたいと感じました。
4. エディタの使い方: Xcodeが使えない
見出しの通りですが、Flutterの開発ではAndroid Studioを使用していたので、Xcodeをほとんど使用したことがなく、エディタの操作に慣れることに時間がかかりました。(Xcodeを使用するのは、証明書適用のときくらいでした、、)
エディタの使い方に関しては慣れるしかなかったのですが、Android StudioのショートカットとXcodeのショートカットを比較していただいているページなどを参考にしたりして、少しずつ慣れていきました。
XcodeとAndroid Studioのショートカットキー比較(Mac)
チームメンバーもXcodeはあまり使ったことがないという人が多かったので、互いに使い方を共有しながら慣れていきました。
余談ですが、Xcodeでネイティブアプリをビルドすると、爆速でビルドが完了したので驚きました。(FlutterでiOSビルドすると5分10分かかることもざら)
5. 言語の違い: Dart vs Java/Kotlin/Swift
Flutterで使われているDart言語は、JavaやJavaScriptを元に作られたシンプルな構文が特徴です。そのため、プログラミング言語を少しでも触れたことがある人なら、比較的学習コストは低く、スムーズに習得できると思います。筆者もDartにはすぐ慣れ、Flutterでのアプリ開発を問題なく進めることができました。
しかし、ネイティブアプリ開発では、Dart以外の言語、例えばJavaやKotlin(Android)、Swift(iOS)と向き合う必要が出てきます。Dartの経験を活かしてJavaコードを読むことはできましたが、特に記述が長く複雑に感じる部分があり、作業効率が低下しているように思いました。一方で、KotlinやSwiftはそもそも見慣れない構文が多く、習得に時間がかかりました。
KotlinとSwiftが読めない
本当に初歩的なところですが、まずは定数宣言の記述に戸惑いました。Kotlinでは定数を「val」、Swiftでは「let」で定義しますが、この時点で書き方がDartと異なることに気付き、「もう全然違う世界に来たな…」という感覚を覚えました。
学習の方針としては、とにかく「Dartと比較して覚えていく」という手法を取りました。
KotlinやSwiftといった未知の言語を一から習得するよりは、読み慣れているDartと比較して、その都度覚えていくのがよいのでは?と考え、「Swiftのこの記法はDartで書くとどう書くんだろう」「Dartで書いた処理をKotlinで書くならどうなるんだろう」というように比較する手法で学習していきました。
初めは全く読めなかったKotlin/Swiftも、Dartと比較してみれば「なんだこんなもんか」と簡単に感じることができるようになり、次第にKotlin/Swift単体でも読めるようになっていきました。
パッケージ使わないんですか
Flutterでは、困ったらパッケージを探して、それを組み込むことを前提にアプリを作っていました。デバイス機能との連携も、パッケージにいろいろとお任せして、自分ではあまりコードを書かずに実装できるというのが便利でした。(それゆえにネイティブの知識も薄かった)
それに対し、KotlinやSwiftでは、標準ライブラリが豊富で、基本的なUIや機能の実装であれば外部パッケージを必要としない場面が多いことに驚きました。
Flutterではパッケージを積極的に活用することで、複雑な実装を簡潔にコーディングできますが、パッケージのメンテナンスに左右されることも多く、パッケージの選定には慎重になる必要がありました。
しかし、KotlinやSwiftでは標準ライブラリが非常に充実しているため、こうした「他者が作ったコードに依存する」という前提が少ないことに気付きました。
ネイティブではデバイス機能の連携やカスタマイズも、標準的なAPIを使って自分でコーディングすることが基本であり、それが学びの深さに繋がっているように感じます。結果として、ネイティブ開発では「仕組みを理解しながらコードを書いていく」というプロセスを自然と踏むことが多く、Flutterで感じていた「便利さ」とは異なる学びの楽しさがあるように思いました。
6. おわりに
Flutterとネイティブ開発の違いを実際に体験することで、新しい視点を得ることができました。
Flutterの便利さや効率性は、スピード感のあるマルチプラットフォーム開発には非常に適している反面、ネイティブ開発における標準ライブラリの豊富さやカスタマイズ性にはまた違った魅力があることを学びました。
この両者の開発手法の特性を理解し、それぞれの強みを活かすことで、より幅広い技術領域を習得し、柔軟性のあるエンジニアとして成長していけると感じました。
