super.function()的位置是否会导致代码中的执行问题?

时间:2019-11-21 10:12:20

标签: android flutter dart

我不知道@MockBean CustomServiceImpl customServiceImpl ; @Rule public ExpectedException exceptionRule = ExpectedException.none(); @Test public void test01_getResultDto() { exceptionRule.expect(CustomException.class); UserUtil userUtil = Mockito.mock(UserUtil.class); Mockito.when(userUtil.getCurrentUser()).thenReturn(null); customServiceImpl.getResultDto ("type", 1L); } 在flutter / dart中的放置是否会影响其余代码的执行。例如。创建和部署控制器。

为。例如。

super.function()

如果我在 @override void foo() { super.function(); controller.function(); } 之后加上了super.function()或这些花括号中的任何代码,该代码会变成虫子吗?还是我应该将其放在controller.function()

之前
  

注意:我已将代码概括化

1 个答案:

答案 0 :(得分:2)

问题并不像您想的那么简单,答案取决于您想要实现的目标。

如果要在执行super实现之前覆盖某些内容,则在覆盖要覆盖的内容之后调用super。例如:

class DoTheMathAndPrint {
   int first = 1;
   int second = 2;


   void iWillDoTheMathAndPrint() {
      int sum = first + second;
      print("The sum is $sum");
   }
}

class NoIWillDoTheMath extends DoTheMathAndPrint {

  @override
  void iWillDoTheMathAndPrint() {
     first = 3;
     second = 5;
     super.iWillDoTheMathAndPrint();
     // will print The sum is 8;
  }
}

如果您想要常规流程,然后“扩展”该流程,则将首先调用super,然后执行代码。例如:

class WellIHateMath extends DoTheMathAndPrint {

  @override
  void iWillDoTheMathAndPrint() {
    super.iWillDoTheMathAndPrint();
    print("I hope it printed $3");
  }
}

现在,当我使用框架的子类(Flutter,Android,iOS)时,我通常会做的是,我决定一种方法是“建设性的”还是“破坏性的”。 “建设性”方法将初始化一些代码,配置等(例如initState)。对于这种方法,我首先要称其为超级方法,我想确保所有内容都由框架设置,然后我才能做我的事情。

对于“破坏性”方法,这种方法用于清理资源,释放内存等,(如dispose()扑朔迷离),我称之为超级,我释放了资源,然后我可以对框架说:“所有好,做好你的工作。”

在dart中有一件事情,对我来说是一个震惊(因为我读得不够多),是使用mixins时的超级调用。您必须非常小心,super不会在超类上被调用,它将在mixin上被调用。例如:

class SomeAwesomeState<T extends StatefulWidget> extends State<T> {

   List<SomeBigObject> _theList = ...smething big;


  @override
  void dispose() {
    _theList.clear();
    super.dispose();
  } 
}

class MyStateWithAnimation extends SomeAwesomeState<AnimationWidget> with SingleTickerProviderStateMixin {

   // some awesome animations here

  @override
  void dispose() {
    //remove whatever here
    super.dispose(); => this will be the super on the SingleTickerProviderStateMixin not on the SomeAwesomeState
  }
}