Flutterの`BottomNavigationBarItem`は親コンポーネントによってlabelが必須か任意か変わる

# 事前知識

`BottomNavigationBar`はたとえば、以下のようにページ遷移を行うアイコンを並べる場合に使います。
掲題の`label`とは`Home`, `Business`などのアイコンの下に表示しているテキストのことです。

![スクリーンショット 2022-04-09 12.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184760/da9f0002-8da5-3fce-b421-b95a5f377233.png)

https://api.flutter.dev/flutter/widgets/BottomNavigationBarItem-class.html

# 背景

`BottomNavigationBarItem`では`label`は`require`なプロパティでは無いのですが、`BottomNavigationBar`で`BottomNavigationBarItem`を使用する場合に`label`が 必須になる エラーが発生しました。

`BottomNavigationBarItem`の中で`require`にしないのはなぜなのか調べてみたところ、使われる親クラスによって制御されていることがわかったので詳細を残しておきます。

# 詳細

## `CupertinoTabBar`の`items`として使用する場合は任意

`CupertinoTabBar`の`item`として`BottomNavigationBarItem`を使用する場合`label`は任意の値になります。

https://api.flutter.dev/flutter/cupertino/CupertinoTabBar-class.html

`label`を指定した場合のソースコードと表示される画面は以下のようになります

```dart
CupertinoTabBar(
  items: const <BottomNavigationBarItem>[
    BottomNavigationBarItem(
      icon: Icon(CupertinoIcons.circle),
      label: 'Tab 1',
    ),
    BottomNavigationBarItem(
      icon: Icon(CupertinoIcons.add),
      label: 'Tab 2',
    ),
  ],
)
```

![スクリーンショット 2022-04-09 12.11.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184760/6133ebcf-5bc0-eac4-1136-514582ae3b7d.png)

`label`を指定しない場合のソースコードと表示される画面は以下のようになります。
アイコンの下のテキストが消えて表示されます。

```diff
CupertinoTabBar(
  items: const <BottomNavigationBarItem>[
    BottomNavigationBarItem(
      icon: Icon(CupertinoIcons.circle),
-      label: 'Tab 1',
    ),
    BottomNavigationBarItem(
      icon: Icon(CupertinoIcons.add),
      label: 'Tab 2',
    ),
  ],
)
```


![スクリーンショット 2022-04-09 12.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184760/bd9bb5bf-65fb-ec20-c035-4c4542184170.png)

## `BottomNavigationBar`の`items`として使用する場合は必須

`BottomNavigationBar`の`item`として`BottomNavigationBarItem`を使用する場合`label`は必須の値になります。


https://api.flutter.dev/flutter/material/BottomNavigationBar-class.html

`label`を指定した場合のソースコードと表示される画面は以下のようになります


```
BottomNavigationBar(
  items: const <BottomNavigationBarItem>[
    BottomNavigationBarItem(
      icon: Icon(Icons.home),
      label: 'Home',
    ),
    BottomNavigationBarItem(
      icon: Icon(Icons.business),
      label: 'Business',
    ),
    BottomNavigationBarItem(
      icon: Icon(Icons.school),
      label: 'School',
    ),
  ],
)
```

![スクリーンショット 2022-04-09 12.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184760/da9f0002-8da5-3fce-b421-b95a5f377233.png)

`label`を指定しない場合はエラーが発生します。

```diff
BottomNavigationBar(
  items: const <BottomNavigationBarItem>[
    BottomNavigationBarItem(
      icon: Icon(Icons.home),
-      label: 'Home',
    ),
    BottomNavigationBarItem(
      icon: Icon(Icons.business),
      label: 'Business',
    ),
    BottomNavigationBarItem(
      icon: Icon(Icons.school),
      label: 'School',
    ),
  ],
)
```

エラーメッセージは以下のように`labe`が必須の旨が出力されます。

```
Every item must have a non-null label

'package:flutter/src/material/bottom_navigation_bar.dart':
Failed assertion: line 188 pos 9: 'items.every((BottomNavigationBarItem item) => item.label != null)'
```

# 環境

* Flutter 2.10.0
* Dart SDK version: 2.16.0