Riverpod Notifier vs AsyncNotifier vs StreamNotifier in Flutter: which one do I extend?

Pick by the return type of build(): T means Notifier, FutureOr means AsyncNotifier, Stream means StreamNotifier. Here is the decision matrix, the type hierarchy that explains why, and the == filtering and state-clobbering gotchas that bite each one. Verified against flutter_riverpod 3.4.2 on Flutter 3.44.2.