如何为通用类State <t extend =“ =” statefulwidget =“”>编写mixin

时间:2019-02-10 15:35:12

标签: inheritance dart flutter mixins

我需要为Flutter的State<T extends StatefulWidget>写一个扩展名,以便可以在我的所有州使用一个函数,比方说showSnackBar("Hello world", 5)。 我尝试写一个mixin

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>中使用此mixin。没有类型符号,我最终会出错:

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,遇到了诸如these之类的问题,但没有成功。

是的,我知道在Flutter中,合成优先于继承,但是我认为这是我不知道的事情,我会使用合成进行工作,我觉得继承是可以的。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

我做了类似的事情;

mixin BaseState{ .... }

它正在工作,但我不知道后遗症。