Decompose は、ルーティング機能とプラグ可能な UI (Jetpack/Multiplatform Compose、Android Views、SwiftUI、Kotlin/React など) を備えたツリー構造のライフサイクル対応ビジネス ロジック コンポーネント (別名 BLoC) にコードを分割するための Kotlin マルチプラットフォーム ライブラリです。 。
ドキュメントと API については、プロジェクトの Web サイトを参照してください。
質問やアイデアがある場合は、「ディスカッション」セクションをご利用ください。 Kotlin Slack チャンネル - #decompose へもようこそ!
⚡⚡⚡ すべてのスター、問題、ディスカッション、プルリクエストなどはどこにありますか?
Badoo/Bumble のさまざまなプロジェクトに 5 年間取り組んできましたが、私は今、新たな冒険に出発しています。その移行の一環として、このリポジトリを Badoo GitHub アカウントに転送するように求められました。
現在、私はコピーとしてこのプロジェクトの作業を続けています。
この移行に関連する重大な変更は行わないでください。ほとんどの外部リンクは壊れてはいけません。リポジトリ リンクも同じです:arkivanov/Decompose。何かが壊れている、または正しく動作していないと思われる場合は、このリポジトリに問題を提出してください。
転送によって主に影響を受けるのは次のとおりです。
- すべての星が転送されました
- すべての問題とディスカッションも転送されました。ここのギャップを埋めるために全力を尽くします。
- すべてのコメント履歴を含むすべてのプルリクエストも消えます。
これからもこのプロジェクトとコミュニティのために全力を尽くしていきます!通常通り営業します!
追加のリソース:
なぜ分解するのか?
- Decompose は、コードを小さな独立したコンポーネントに分割し、それらをツリーに編成します。各親コンポーネントは、その直接の子のみを認識します。
- Decompose は UI コードと非 UI コードの間に明確な境界線を引くため、次のような利点があります。
- 懸念事項のより適切な分離
- プラグ可能なプラットフォーム固有の UI (Compose、SwiftUI、Kotlin/React など)
- ビジネス ロジック コードは純粋なマルチプラットフォーム単体テストでテスト可能
- ナビゲーション状態は完全に公開されており、必要な UI を接続したり、お気に入りの UI フレームワークの API を使用して好きなようにアニメーション化したり、事前定義された API を使用したりできます。
- ナビゲーションは古い状態から新しい状態への純粋な機能であり、制限なくナビゲートします。
- コンストラクターを介した適切な依存関係注入 (DI) と制御の反転 (IoC) (タイプセーフな引数を含むがこれに限定されない)。
- 共有ナビゲーションロジック
- ライフサイクルを意識したコンポーネント
- バックスタック内のコンポーネントは破棄されず、UI なしでバックグラウンドで動作し続けます。
- 状態の保存 (Android では自動的に、他のすべてのターゲットでは
kotlinx-serialization
経由で手動で) - 構成変更に対してインスタンスを保持する (別名 ViewModel) (主に Android で便利)
ミームタイム!
設定
ドキュメントの「インストール」セクションを確認してください。
サポートされているプラットフォーム
一般に、Decompose は次のターゲットをサポートします: android
、 jvm
、 ios
、 watchos
、 tvos
、 macos
、 wasmJs
、 js
。ただし、一部のモジュールはすべてのターゲットをサポートしていないか、サポートは Decompose のバージョンに依存します。詳細については、インストールに関するドキュメントを参照してください。
概要
ここではライブラリの重要な概念をいくつか示します。詳細についてはドキュメントを参照してください。
- コンポーネント - すべてのコンポーネントは独自のライフサイクルを持つロジックの一部を表し、UI はオプションであり、外部に接続されます。
- ComponentContext - すべてのコンポーネントには独自の [ComponentContext] があり、コンポーネントのライフサイクルを認識し、状態の保存、インスタンスの保持 (別名 AndroidX
ViewModel
)、および戻るボタンの処理が可能になります。 - 子スタック - 子コンポーネント間のナビゲーションを有効にし、ネストされたナビゲーションもサポートされています
- 子スロット - 一度に 1 つの子コンポーネントのみを許可するか、まったく許可しません
- 子ページ - 1 つの選択されたコンポーネントを含む子コンポーネントのリスト (ページャーのようなナビゲーションなど)
- 汎用ナビゲーション - 事前定義されたモデルがニーズに合わない場合に、独自のカスタム ナビゲーション モデルを作成する方法を提供します。
- ライフサイクル - コンポーネント内のライフサイクル イベントをリッスンする方法を提供します
- StateKeeper - コンポーネントが破棄されたときに、コンポーネント内の状態またはデータを保存できるようにします。
- InstanceKeeper - コンポーネント内のインスタンスを保持します ( AndroidX
ViewModel
と同様) - BackPressedHandler - 「戻る」ボタンの押下を処理およびインターセプトする方法を提供します。
コンポーネント階層
プラグイン可能な UI 階層
代表的なコンポーネント構造
クイックスタート
ドキュメントの「クイック スタート」セクションを参照してください。
サンプル
各サンプルの詳細な説明については、ドキュメントの「サンプル」セクションを参照してください。
テンプレート
プロジェクトを開始するために使用できるテンプレート リポジトリを確認してください。
記事
分解 — Kotlin マルチプラットフォームのライフサイクル対応コンポーネントとナビゲーションの実験
(ほぼ) 完全にクロスプラットフォームな Kotlin アプリケーション
Jetpack/Multiplatform Compose 用の包括的な 30 行のナビゲーション - Decompose が冗長で、Compose の上に構築されたものを希望する場合。
Artur Artikov 氏による「コンポーネントベースのアプローチ」シリーズ
- パート 1: Android アプリケーションの複雑さとの戦い
- パート 2: Decompose ライブラリを使用した画面の実装
著者
Twitter: @arkann1985
このプロジェクトが気に入ったら、いつでもどうぞ ;-)