Как написать миксин для универсального класса State - PullRequest
0 голосов
/ 10 февраля 2019

Мне нужно написать расширение для State<T extends StatefulWidget> Флаттера, чтобы я мог использовать функцию во всех моих состояниях, скажем, showSnackBar("Hello world", 5).Я пытался написать миксин

mixin BaseState on State<ProfileScreen> {
  final GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();

  void showSnackBar(String text) {
    setState(() {
      scaffoldKey.currentState.showSnackBar(new SnackBar(
          content: new Row(
            children: <Widget>[
              new CircularProgressIndicator(),
              new Text(text == null ? "  Logging in" : "      $text")
            ],
          )));
    });
  }

  void hideSnackBar() {
    setState(() {
      scaffoldKey.currentState.hideCurrentSnackBar();
    });
  }
}

Как вы можете видеть, теперь он смешан на State<ProfileScreen>.Это проблема, потому что я могу использовать этот миксин только в class ProfileScreenState extends State<ProfileScreen>.Без обозначения типа я получаю сообщение об ошибке:

error: The class 'ProfileScreenState' cannot implement both 'State<ProfileScreen>' and 'State<StatefulWidget>' because the type arguments are different. (conflicting_generic_interfaces at [mobile] lib/Screens/profile.dart:17)
error: Type parameters could not be inferred for the mixin 'BaseState' because no type parameter substitution could be found matching the mixin's supertype constraints (mixin_inference_no_possible_substitution at [mobile] lib/Screens/profile.dart:17)

Я много пытался в Google, видел такие вопросы, как эти , но безуспешно.

И даЯ знаю, что во Флаттере композиция предпочтительнее наследования, но я думаю, что я не знаю, смогу ли я работать с композицией, и я чувствую, что с наследованием все будет в порядке.

1 Ответ

0 голосов
/ 10 февраля 2019

Я думаю, вы ищете что-то вроде https://github.com/flutter/flutter/blob/3fbd140e77601686acb336cd2af2838d03ba0572/packages/flutter/lib/src/widgets/ticker_provider.dart#L155

mixin BaseState<T extends StatefulWidget> on State<T> {
...