Вывод типа для дженериков в Dart - PullRequest
1 голос
/ 29 мая 2020

Если вы изо всех сил пытаетесь понять, почему вывод типа 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>(..)), он будет работать.

Надеюсь, кто-то может указать мне правильное направление или сказать, что это может ' т быть сделано.

...