KMP「Kotlin Multiplatform」で困ったことまとめ
KMPのプロジェクトの作成する方法
KMPのプロジェクトを作成するときは、Intellijのプラグインに入っているテンプレートを使うと古いため、
https://kmp.jetbrains.com/ を用いて作成すると良い。
Android, iOS以外にもWebやデスクトップ、サーバーも作れる
ComposeMultiplatform
UIライブラリの部分だけは、こっちでも良いかも?
Wasmを起動させる時にGradleのタスクがない時は
Wasmを起動させる時にGradleに表示されなかったら以下のURLを参考にしてGradleのタスクを全て表示されるようにしよう
コードを変更したときにページを自動的に再読み込みする
--continuous
を追加することで、自動で再読み込みしてくれる
iOSのデバイスを切り替えたい時は
iOSのデバイス切り替えは、Rub/Debugのコンフィグを変えて行う
KMPにおけるMaterial3の使い方
上を
implementation(compose.material)
下に変更するだけ
implementation(compose.material3)
kotlinUpgradeYarnLock
task to actualize lock file (yarnファイルのエラー)
Lock file was changed. Run the yarnファイルでエラーが出た時の対応
Execution failed for task ':kotlinStoreYarnLock'.
> Lock file was changed. Run the `kotlinUpgradeYarnLock` task to actualize lock file
以下のコマンドを実行して、yarnファイルをアップデートする
./gradlew kotlinUpgradeYarnLock
material-icons-extendedのパッケージが使えないけどどうしたらいい?
iOSが対応していないって怒られる...
Jetbrinsがデフォルトで用意をしてくれているので、それを読み込ませるようにすれば大丈夫。
以下を追加すればOK
implementation(compose.materialIconsExtended)
Wasmだと日本語フォントがぶち殺される。
そのためフォントを自分で用意し直す必要がある
以下の記事を見ながらフォントを変える必要がある。
フォントはGoogleIconのフォントでも使うといいと思う
ポイントは、読み込ませたResフォルダに関しては一度ビルドを通さないとClassが再生成されないため、追加したタイミングでBuildを通してからFontの設定をしよう
テキストを選択できるようにする方法!!
超単純 SelectionContainer
で選択できるようにする部分を囲めばOK!!
SelectionContainer {
Text("A ISO/IEC 20248 DAID is the same as a ISO/IEC 15459 IAC and CIN concatenated as.....")
}
[!TIP]
ただし、iOSのようなsafari系のブラウザだと何も表示されないので注意
Wasmで作成したアプリをデプロイしてみる
1. デプロイするためのファイルの作成
案外簡単にできる。
以下の手順を踏んでとりあえずデプロイするためのファイルを作る
2. Gitignoreの変更
次に、gitignoreに以下を追加して作成したファイルをgitに含めるようにする。
!*/composeApp/build/dist/wasmJs/productionExecutable/
3. cloudflarePagesでデプロイ
以下のようにデプロイするためのファイルを出力した場所に設定して、コマンドを何も書かなければ、とりあえず、手動でエクスポートして、ファイルをアップロードして、動かしてくれるシステムは完成!!
URL を用いて画面遷移をする方法
これを用いることで、URLに飛べるようになる。
val uriHandler = LocalUriHandler.current
uriHandler.openUri(websiteUri)
「Compose for Web でアドレスバーのURLとCompose Navigationのrouteを同期させてみる試み」をCloudflarePagesでやってみる
以下サイトをめっちゃ参考にしています。
CloudflarePagesにおいては_worker.jsファイルでのリライト設定を行う
jsで行うので、逆にやりやすいかもしれない。
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
// リライトルール: `.js`以外のリクエストを`index.html`にルーティング
if (!url.pathname.match(/\.js$/)) {
url.pathname = "/index.html";
return fetch(url.toString(), request);
}
// `.js`ファイルのリクエストはそのまま返す
return fetch(request);
}
};
デプロイURL
作成したForkのレポジトリ
java.lang.OutOfMemoryError: Java heap space メモリ不足エラーと言われた時
単純にメモリが足りていないので、メモリを追加してあげましょう
2GB → 8GBとか
org.gradle.jvmargs=-Xmx8192M -Dfile.encoding=UTF-8 -Dkotlin.daemon.jvm.options\="-Xmx8192M"
ありえないぐらいBuildが遅い場合の対策方法
Gradleのキャッシュ機能を使った方がいい
#Gradle
org.gradle.caching=true
org.gradle.configureondemand=true
org.gradle.parallel=true
org.gradle.jvmargs=-Xmx8192M -Dfile.encoding=UTF-8 -Dkotlin.daemon.jvm.options\="-Xmx8192M"
- caching: Gradleビルドキャッシュを利用する
- configureondemand: 実験的機能。タスクの依存関係にあるプロジェクトのみを実行するのでマルチプロジェクトで効果的
- parallel: 並列数をorg.gradle.workers.max(デフォルトはCPU数)に指定
- jvmargs: ビルドJVMの起動パラメータ(Xmxはローカル/CIに合わせて)