Compose クロスプラットフォームと KMM について話す

著者: 黄林青

多くの開発者は Compose Multiplatform と KMM を知らない可能性があるため、この共有では次の点で Compose Multiplatform と KMM を紹介し、Kotlin クロスプラットフォームの魅力を体験してみましょう。

  • Compose Multiplatform と KMM の関係
  • Compose MultiplatformとKMMの実践
  • 開発者はどのように選択すべきか

ここで説明する必要があるのは、この共有は使用の観点からのみ共有されるものであり、クロスプラットフォーム技術の普及としては、なぜクロスプラットフォームであるのかといった、クロスプラットフォームの基礎となる原理には関与しないということです。 。これらについて話してみてはいかがでしょうか? 理由は非常に複雑で、簡単に言うとやり方が分からないのです。

Compose Multiplatform と KMM の関係

Compose Multiplatform と KMM の関係を理解するには、Compose Multiplatform と KMM が何であるかを理解することだけが必要です。

KMMとは

KMM の正式名は Kotlin Multiplatform Mobile で、KMP (Kotlin Multiplatform Project) に対応します。これは、実際には Kotlin モバイル クロスプラットフォーム プロジェクトと Kotlin クロスプラットフォーム プロジェクトのコレクションです。KMM はマーケティング用語に近いです。モバイルという言葉について心配する必要はありません。知っておく必要があるのは、以下で説明する KMM は Kotlin クロスプラットフォームを指しており、モバイル端末に限定されないということです。

KMM を使用すると、マルチプラットフォーム アプリケーションの開発を簡素化できます。KMM を通じて、開発者は iOS、Android、デスクトップ、Web アプリケーション間でビジネス ロジックの共通コードを共有でき、必要に応じてプラットフォーム固有のコードを作成することもできます。したがって、KMM はクロスプラットフォームでのビジネス ロジック部分のみを担当します。

たとえば、この図のデータ層とネットワーク ドメイン層は、KMM を使用してパブリック ビジネス ロジックを完成できます。

KMM が立ち上げられた初期の頃は、Compose Multiplatform がまだリリースされていなかったため、開発者の 90% がモバイル端末の主な仕事は UI を書くことだと信じていたため、当時は Compose Multiplatform がリリースされていなかったため、誰もが KMM は味気ないと感じていました。プラットフォームはクロスプラットフォームとは言えませんか?プラットフォーム?

しかし、この見方は実際には誤りであり、ログ システムや埋め込みポイントなどの多くのビジネス ロジックに KMM を使用することは依然として非常に有益です。

その後、Compose Multiplatform の登場により、KMM の欠点が補われました。では、Compose マルチプラットフォームとは何でしょうか?

Compose マルチプラットフォームとは

Jetpack Compose は、Android によって正式に開始された宣言型 UI フレームワークです。Compose Multiplatform は、JetBrains によって維持されている Compose クロスプラットフォーム フレームワークです。UI クロスプラットフォームに焦点を当てており、iOS、Android、Web、デスクトップなどもサポートしています。

Compose クロスプラットフォームを使用すると、KMM の欠点が補われます。

Compose Multiplatform と KMM は同じものではないのではないかという恥ずかしい疑問が常にあると感じていますが、確かに同じものではありません。結局のところ、バージョンの更新とメンテナーは異なります。しかし結局のところ、Kotlin の Native と JS の根本的なサポートが Compose Multiplatform の基礎となっています。したがって、いつかそれらが統合され、バージョン更新とプラグインのサポートが統合されることを願っています。したがって、私はこれらを Kotlin フルプラットフォームと直接呼ぶことを好みます。

実際、KMM と Compose Multiplatform の関係はもうわかりました。次に、Compose Multiplatform と KMM がどのように実装されるかを見てみましょう。

Compose MultiplatformとKMMの実践

Compose Multiplatform と KMM には再利用された UI と再利用されたビジネス ロジックがあるため、それを個別に実践する方法を見てみましょう。

KMMの練習

KMM はビジネス ロジック部分の実装に使用されますが、ここでは Android と iOS のみを例に挙げます。ここで、Compose Multiplatform と KMM は独立して使用できることをもう一度繰り返しておきます。つまり、KMM を使用すると、Android と iOS のネイティブ UI をそれぞれ作成でき、Compose Multiplatform をクロスプラットフォームで使用すると、次のことも実現できます。他の端末の業務をそれぞれロジックで処理します。

プロジェクトを作成する

Android Studio では、Kotlin Multiplatform Mobile プラグインを使用して、KMM をサポートするプロジェクトを迅速に作成できます。

プラグインをインストールした後、Android Studio を開くと、KMM をサポートするプロジェクトを直接作成できます。

作成時にモジュールの情報を記入していきます

プロジェクトが作成されると、生成されたプロジェクトのディレクトリ構造は次のようになります。

androidAppとiOSAppはAndroidとiOSの対応するコードライブラリで、共有モジュールはAndroidとiOSの共通のビジネスロジックを格納する部分です。

KMM プラグインは Android と iOS のソース セットのみを作成します。他のプラットフォームを作成したい場合は、自分でフォルダーを作成し、ターゲット プラットフォームを指定できます。

プロジェクトを作成した後、パブリック ビジネス ロジックを処理する方法を見てみましょう。

一般的なビジネスロジック

両端が共有できるロジックを commonMain フォルダーに直接置くことができます。オープン ソース ライブラリの依存関係は commonMain ディレクトリに書き込まれます。

ここにネットワーク リクエスト ライブラリ Ktor とシリアル化の依存関係を追加します。Kotlin クロスプラットフォームであるため、Ktor は Kotlin によって起動されるネットワーク リクエスト ライブラリであるため、Ktor を使用することが間違いなく最良の選択です。

このコードは、ネットワーク リクエスト フレームワークである Ktor の基本的な使い方です。説明は省略します。ここでは、「Hongyang」ボスの「Wandroid」にある「Daily Question」を取得する getData メソッドを定義します。data」

次に、データを受信するために Android または iOS の UI コードをそれぞれ記述します。ここではリターン表示をテキスト内に直接表示しており、最終的に実装されたプログラムはこんな感じです。

この UI は、後で Compose Multiplatform に実装します。このようにして、デュアル プラットフォーム向けの単純なデータ リクエストの例を実現しました。

KMM のコミュニティ サポート

現在、先ほど使用したネットワーク リクエスト フレームワーク Ktor、依存関係注入 Koin、シリアル化コンポーネントなど、多くの公式ライブラリがすでにクロスプラットフォームをサポートしています。

さらに、Android 開発にとって最も嬉しいニュースは、Jetpack も昨年 10 月からクロスプラットフォームのサポートを開始していることですが、現在 Jetpack でサポートされているクロスプラットフォーム コンポーネントは Annotations、Collections、DataStore の 3 つだけです。

もちろん、一部の有名なアプリでは、Cash App オープンソースの Paging ページング ライブラリなど、一部のコンポーネントもオープンソース化しています。

AndroidX でのページング設計と同様に、paging-common モジュールはストレージ層とビューモデル層を提供し、paging-runtim モジュールは UI 層を提供します。

最も重要なことは、paging-common の API は AndroidX の API とまったく同じであり、パッケージが androidx.paging から app.cash.paging に移行されるだけであるため、AndroidX の Paging に従ってこの部分を直接使用することです。 . できます。

しかし、実際のプロジェクトでは、コミュニティのサポートだけに依存するだけではすべての企業を満足させることができない可能性があります。もちろん、一部のオープンソース貢献者は一部のコンポーネントをオープンソース化していますが、安定性を確保するには、通常、独自のビジネス ロジックを個別に実装する必要があるため、同じ API セットを確実に使用するにはどうすればよいでしょうか?

期待と実際

Kotlin の Expect キーワードとactual キーワードに依存しています。Expect は達成を期待する方法であり、actual はそれを達成する方法であり、インターフェースと実装クラスに少し似ています。たとえば、システムの Bluetooth をオンにするというビジネス ロジックを実装したいとします。

まず、commonMain の Expect を使用してこのインターフェイスを定義する必要があります

次に、shares モジュールの下の androidMain ディレクトリと iOSMain ディレクトリで Bluetooth をオンにする方法を実現します。

このようにして、複数のプラットフォームでの呼び出しに同じ API が使用されるようになり、呼び出し元は特定の実装に注意を払う必要がなくなります。ここで、KMM について説明しました。上記の理解から、KMM は現時点では実際のプロジェクトで使用できることがわかりますが、待つことはできます。Kotlin のロードマップには、正式バージョンが今年リリースされる予定であると記載されています。期待できます。それを一緒に。次に、Compose Multiplatform を一緒に練習しましょう。

マルチプラットフォームの作成を練習する

Compose Multiplatform は UI の再利用に重点を置いていますが、前述したように、KMM と Compose Multiplatform のバージョンとプラグインが統一されていないという厄介な問題があります。KMM プラグインを使用すると、Android Studio で KMM プロジェクトを迅速に作成できますが、現時点では、Compose Multiplatform プロジェクトを迅速に作成したい場合は、新しいバージョンの IDEA のみを使用できます。

プロジェクトを作成する

最新バージョンの IDEA をダウンロードして Compose Multiplatform プロジェクトを作成しますが、さらに恥ずかしいのは、iOS がまだアルファ段階にあるため、IDEA が iOS プラットフォーム用のプロジェクトを作成できないことです。

したがって、Kotlin の完全なプラットフォームを使用したい場合は、2 つの方法があります。

  • IDEA を使用してプロジェクトを作成し、KMM 依存関係構成を追加します
  • Android Studio を使用してプロジェクトを作成し、Compose Multiplatform 構成を追加します
  • 公式テンプレートプロジェクトを使用する

ここでは、先ほど作成した KMM プロジェクトをベースに、KMM をベースに Compose Multiplatform の構成を追加します。

プロジェクトを構成したら、それを実現するために毎日の質問の機能をクエリするだけです。もちろん、構成中に多くの落とし穴を踏んだはずです。これらすべてをブログに記録しました。

双方向のネットワークデータ表示を実現

iOSApp.swift のコードは次のようになります。

Main_iosKt.MainViewController は、共有モジュールの iOSMain ディレクトリに main.ios.kt ファイルを作成することで取得されます。コードは次のとおりです。

したがって、ネットワーク データを解析するための Compose メソッドを作成し、それを共有モジュールの commain ディレクトリに実装し、Application の下で呼び出すことができます。

このコードは誰でも理解でき、Jetpack Compose と完全に一致しています。データは Message メソッドを通じて表示されます。ここでは、作成者とタイトルのみが表示されます。コードは次のとおりです。

次に、この方法で Android および iOS プログラムを実行できます。KMM プラグインを使用して iOS プログラムを直接実行できることに注意してください。ただし、Xcode がまだインストールされているという前提条件があります。Android と iOS の効果が示されています。下の図のとおりです。

ページの効果は完全に一貫しており、ページ内のこの機能に関する限り、ビジネス ロジックと UI の 100% の再利用が達成されていることがわかります。なんとタイらしくないのか!

デスクトップとウェブ

上記では Android と iOS を例に挙げましたが、実際には Desktop と Web は同じもので、それに比べて Desktop は比較的完成度が高く、UI も Jetpack Compose を十分に再利用できると思います。この例では、デスクトップと Web のそれぞれの効果を実感しました。

ここで Web についてもう少し詳しく説明します。初期の頃、Compose for Web は Compose HTML を使用して実装されました。Compose HTML は、HTML と CSS で Web ユーザー インターフェイスを作成するための Composable コンポーネントを提供する Kotlin/JS 指向のライブラリです。この問題は非常に深刻で、Jetpack Compose で再利用できないとは言えませんが、それとは関係ありません。

たとえば、実装図のデータを見ると、Compose HTML はこのように書かれていますが、当時、これを見たときはかなりの崩壊でした。幸いなことに、Kotlin はバージョン 1.8.20 で Kotlin/Wasm をリリースしました。最新の Compose for Web は Kotlin/Wasm に基づいており、現在実験段階にあります。Jetpack Composeでページは完全に再利用できるので、Compose HTMLの書き方に注目して学習をやめてください。

公式では Compose Multiplatform 用のテンプレートがいくつか用意されており、Kotlin/Wasm 用のテンプレートもありますが、Compose Wasm for Web 用のテンプレートは存在しないため、github でテンプレートをオープンソースし、興味のある方はぜひご利用ください。

先ほど述べたコンポーネントの問題と同様、Compose Multiplatform テクノロジーの成熟に伴い、遅かれ早かれ公式は KMM と Compose Multiplatform の両方をサポートする新しいプラグインをリリースするでしょう。

ネイティブ UI との相互運用性

Jetpack Compose を使用して Android を開発する場合、シナリオによっては、Jetpack Compose と XML をネストして使用する必要がある場合があります。その場合、この種のシナリオはクロスプラットフォームで確実に存在します。iOS では、共有ユーザー インターフェイスで UIKitView を使用できます。複雑なプラットフォームを埋め込むことができます。 - マップ、Web ビュー、メディア プレーヤー、カメラなどの固有のウィジェット。

つまり、これらは Compose Multiplatform のクロスプラットフォーム開発を妨げる要因ではありません。

開発者はどのように選択すべきか

現時点では、Compose とのクロスプラットフォーム競争の主力は Flutter であるはずです。多くの人はいつもそれらを比較するのが好きです。今の比較では、Compose Multiplatform は明らかに Flutter ほど優れていないということになりますが、この比較は Compose Multiplatform を少しいじめています。結局のところ、Compose Multiplatform はまだ非常に若いのです。

もちろん、これは非常にオープンなトピックであり、私は私の個人的な意見を述べているだけです。Flutter には常に言語の壁がありますが、KMM と Compose Multiplatform は Android 開発者にとってほぼ無料です。もちろん、KMM と Compose Multiplatform の使用を妨げる可能性のある 2 つのグループの人々がいます。

  • Jetpack Compose を使用したことがない

Jetpack Compose を使用したことがない人にとっては、マップや WebView などの一部のコンポーネントのサポートに時間がかかる可能性があることは十分に理解できますが、結局のところ、今は XML を使用することに問題はありません。Kotlinを一度も体験したことがない人もまだいます。

  • Kotlinを使ったことがない

農作業に従事している人やその下位レベルの人を除けば、実際のところ私には理解するすべもなく、言葉を失います。多くの人が私に語った理由は、Java も使える、上司が Java の使用を許可していない、会社のプロジェクトが古い、などでしたが、実際、これらはすべて今では言い訳になっています。

すでに Kotlin を使用している場合は、Jetpack Compose を学習することをお勧めします。第一に、これはトレンドであり、第二に、クロスプラットフォームのスキルが拡張されます。今後数年間も Android 開発に携わりたいのであれば、断る理由はありません。

Jetpack Compose があまり得意ではない小規模なパートナーがいる場合は、 「Jetpack Compose Family Bucket Notes」を参照してくださいhttps://qr18.cn/A0gajp

おすすめ

転載: blog.csdn.net/weixin_61845324/article/details/131585649