geDemのアバターアイコン
geDem
 Blog
記事のカバー写真

警告「Optional Modifier parameter should have a default value of Modifier」の回避方法

geDemのアバターアイコン
geDem
ペン

あらすじ

Jetpack Compose の公式チュートリアル(インタラクティブな Dice Roller アプリを作成する)を進めていたら、以下の警告が出ました。

スクリーンショット 2024-04-20 9.59.13.png

スクリーンショット 2024-04-20 9.51.14.png

警告の翻訳: オプショナルの Modifier は初期値が「Modifier」であるべきです。

問題のあったコード

// サイコロコンポーザブル
@Composable
fun DiceWithButtonAndImage(
    modifier: Modifier = Modifier
        .fillMaxSize()
        .wrapContentSize(Alignment.Center)
) {
    // サイコロが振られた時の処理
    // [省略]
    }
    Column(
        modifier = modifier,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        // [省略]
    }
}

「初期値に Modifier 指定しとるやろがい!!公式チュートリアルのコードやぞ!!!」(← 間違ってます)

問題点

エラーの詳細を見てみたら、こんなことが書かれていました。

Optional Modifier parameter should have a default value of Modifier The first (or only) Modifier parameter in a Composable function should follow the following rules:

  • Be named modifier
  • Have a type of Modifier
  • Either have no default value, or have a default value of Modifier
  • If optional, be the first optional parameter in the parameter list

日本語訳するとこんなかんじ ↓

オプショナルの Modifier は初期値が「Modifier」であるべきです。 最初の(もしくは 1 つだけの)Modifier 引数は、以下のルールに従わなければなりません。

  • 引数名が「modifier」であること
  • Modifier 型で指定されていること
  • 初期値が指定されていない、もしくは初期値は「Modifier」であること
  • オプショナルなら、一番最初の引数として設定してあること

で、元のコードを見てみると・・・

// サイコロコンポーザブル
@Composable
fun DiceWithButtonAndImage(
    modifier: Modifier = Modifier
        .fillMaxSize()
        .wrapContentSize(Alignment.Center)
) {

引数の中で Modifier にいろいろとメソッドを指定しているので、上記のルールの 3 番目「初期値が指定されていない、もしくは初期値は「Modifier」であること」に違反していますね。

おそらく素の Modifier しか指定しちゃダメということでしょう。


(また、仮に DiceWithButtonAndImage コンポーザブルを複数使う場合、呼び出す時に片方だけに Modifier メソッドを指定すると、引数内で指定したメソッドが全て上書きされてしまいます・・・参考)


解決策

// サイコロコンポーザブル
@Composable
fun DiceWithButtonAndImage(modifier: Modifier = Modifier) {
    // サイコロが振られた時の処理
    // [省略]
    }
        Column(
            // カラムのレイアウト
            modifier = modifier
                .fillMaxSize()
                .wrapContentSize(Alignment.Center),
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            // [省略]
        }
    }

Modifier に指定するメソッドを引数内で指定するのではなく、modifier 引数を使うところでメソッドを指定してあげれば解決します。

🙂‍↕️最後まで読んでいただきありがとうございます🙂‍↕️