Если вы изо всех сил пытаетесь понять, почему вывод типа Dart не понимает эту структуру с обобщениями.
Вопрос: это ограничение языка или я могу улучшить свой код, чтобы Дарт понимал тип возвращаемой переменной?
Мой код выглядит следующим образом.
class BaseState extends ChangeNotifier {
static T of<T>(BuildContext context, {bool listen = true})
=> Provider.of<T>(context, listen: listen);
static Future<T> dispatcher<E extends BaseEvent<T>, T extends BaseState>(BuildContext context, E event)
=> of<T>(context, listen: false).dispatch<E, T>(event);
...
}
И я хочу назвать это так:
var newState = await BaseState.dispatcher(context, LoginToggleEvent());
print(newState.isLoggedIn);
Событие LoginToggleEvent
имеет определение класса
abstract class AppEvent extends BaseEvent<AppState> {}
class LogginToggleEvent extends AppEvent {
...
}
И AppState
является дочерним class of BaseState
.
Проблема в том, что если я настрою его так, dart скажет, что тип возвращаемого значения - BaseState
, и я ожидал бы, что это будет AppState
. Поскольку событие E - это AppEvent<AppState>
.
- Если я изменю
var newState
на AppState newState
, оно будет работать. - Если я явно приведу его (как AppState), он будет работает.
- Если я добавлю явные значения для диспетчера (
dispatcher<AppEvent, AppState>(..)
), он будет работать.
Надеюсь, кто-то может указать мне правильное направление или сказать, что это может ' т быть сделано.