【Flutter】Providerのオプションと意味を総まとめ！

Providerパッケージにはさまざまな種類のProviderがProviderの種類やコンストラクタの種類によって渡せる引数(オプション)が異なり混乱のもととなるので、コンストラクタが取りうる引数の種類一覧と、各コンストラクタごとに使える引数を以下にまとめます。

# コンストラクタが取りうる引数一覧

Tは保持するオブジェクトの型。
(`Provider<T>` ←これ)

- Key key
  - ふつうのwidgetのkeyと同じ
- Widget child
- bool lazy
  - trueにしておくと、provideインスタンスの生成時ではなくvalueがはじめて評価されるときに`create`または`update`が呼ばれる
  - 参考: https://github.com/rrousselGit/provider#migration-from-v3x0-to-v400
- UpdateShouldNotify\<T> updateShouldNotify
  - Providerでは、InheritedWidgetでは継承先でoverrideしていた`updateShouldNotify`を引数として渡して定義できる。
  - UpdateShouldNotifyの定義は、`typedef UpdateShouldNotify<T> = bool Function(T previous, T current);`

#### デフォルトコンストラクタ専用

- Crate\<T> create
  - 保持するオブジェクトを生成する(以下valueと呼ぶ)
  - Createの定義は、`typedef Create<T> = T Function(BuildContext context);`
- Dispose\<T> dispose
  - Providerがunmountされるときに呼ばれる(`State.dispose`とほぼ同じ)
  - Disposeの定義は、`typedef Dispose<T> = void Function(BuildContext context, T value);`
  
#### value()コンストラクタ専用
- T value
  - Providerに渡されるオブジェクト(以下valueと呼ぶ)

デフォルトコンストラクタは、createで生成したvalueに対して最期までdisposeで面倒を見るという感じ。
value()コンストラクタは、よそから来たvalueをちょっと使わせてもらうだけで一生の面倒は見ない。

#### FutureProvider/StreamProvider専用
- T initialData
    - StreamProviderではstreamに値がまだ流れてきていないときの初期値
    - FutureProviderではFutureが完了する前に使う値
- ErrorBuilder\<T> catchError
    - エラーが起こったときにもvalidなvalueを生成するための引数
        - ErrorBuilderの定義は`typedef ErrorBuilder<T> = T Function(BuildContext context, Object error);`

#### Proxy系Provider専用

(Proxy系ProviderはProxyProvider以外にもいろいろな亜種がある。今回は紹介しない)

- T update
    - Proxyが依存する値からvalueを生成する。
    - typedefで定義されるが、Providerの種類によって形が変わる。


# Providerごとの渡せる引数まとめ
## Provider\<T\>

### デフォルトコンストラクタ
- Key key
- Crate\<T> create(必須)
- Dispose\<T> dispose
- bool lazy
- Widget child

### value()コンストラクタ
- Key key
- T value(必須)
- UpdateShouldNotify\<T> updateShouldNotify
- Widget child


## ListenableProvider\<T extends Listenable\>
### デフォルトコンストラクタ
- Key key
- Crate\<T> create(必須)
- Dispose\<T> dispose
- bool lazy
- Widget child


### value()コンストラクタ
- Key key
- T value(必須)
- UpdateShouldNotify\<T> updateShouldNotify
- Widget child

いずれの引数もProviderと同じ

## ChangeNotifierProvider\<T extends ChangeNotifier\>
### デフォルトコンストラクタ
- Key key
- Create<T> create(必須)
- bool lazy
- Widget child

disposeは渡すことができない。代わりに、自動でChangeNotifier.dispose()を呼んでくれる。

### value()コンストラクタ
- Key key
- T value(必須)
- Widget child

いずれのコンストラクタにもupdateShouldNotifyがない。
値の変更の通知はChangeNotifier.notifyListeners()にまかせているためだと思われる。

## ValueListenableProvider\<T>
ValueListenableは抽象クラスで、implementは[ValueNotifierクラス](https://api.flutter.dev/flutter/foundation/ValueNotifier-class.html)と[Animationクラス](https://api.flutter.dev/flutter/animation/Animation-class.html)。
AnimationもProviderに渡せる！！

### デフォルトコンストラクタ
- Key key
- Create \<ValueNotifier\<T>> create(必須)
- UpdateShouldNotify\<T> updateShouldNotify
- bool lazy
- Widget child

### value()コンストラクタ
- Key key
- ValueListenable\<T> value(必須)
- UpdateShouldNotify\<T> updateShouldNotify
- Widget child

## FutureProvider\<T>
### デフォルトコンストラクタ
- Key key
- Create\<Future\<T>> create(必須)
- T initialData
- ErrorBuilder\<T> catchError
- UpdateShouldNotify\<T> updateShouldNotify
- bool lazy
- Widget child

### value()コンストラクタ
- Key key
- Future\<T> value(必須)
- ErrorBuilder\<T> catchError
- UpdateShouldNotify\<T> updateShouldNotify
- bool lazy
- Widget child

## StreamProvider\<T>
### デフォルトコンストラクタ
- Key key
- Create\<Stream\<T>> create(必須)
- T initialData
- ErrorBuilder\<T> catchError
- UpdateShouldNotify\<T> updateShouldNotify
- bool lazy
- Widget child

### value()コンストラクタ
- Key key
- Stream\<T> value(必須)
- ErrorBuilder\<T> catchError
- UpdateShouldNotify\<T> updateShouldNotify
- bool lazy
- Widget child


## ProxyProvider
ここではTは依存している値の型。Rは変換後の値の型。
### デフォルトコンストラクタ
- Key key
- Create<R> create
- ProxyProviderBuilder<T, R> update(必須)
    - ProxyProviderBuilderの定義は、`typedef ProxyProviderBuilder<T, R> = R Function(
  BuildContext context,
  T value,
  R previous,
);`
- UpdateShouldNotify<R> updateShouldNotify
- Dispose<R> dispose
- bool lazy
- Widget child

value()コンストラクタはない。