当可选参数之一不是成员变量并且它是必需的时,如何扩展 class?

How to extend a class when one of the optional argument is not a member variable and it is required?

这是代码。我们有一个 TabController(来自 sdk),我正在扩展这个 TabController class:

class TabController extends ChangeNotifier {
   int length;
   TabController({ int initialIndex = 0,
      @required this.length, 
      @required TickerProvider vSync
   }):assert(length != null),
       assert(vSync != null);

} //end of TabController

class AppTabController extends TabController {

    AppTabController(int mInitialIndex,
       int mLength,
      TickerProvider mVsync):super(length: mLength, mVsync: vsync ){}

}

现在 AppTabController 的构造函数出现语法错误。好像我不能延长 TabController class 因为:

  1. vsync不是TabController
  2. 的成员变量
  3. TabController 构造函数本身有一些断言,如果没有传递所需的参数,它就会崩溃。

这些是编译错误:

  1. 错误:未定义命名参数 vsync
  1. this.length需要成员变量。
  2. @required 需要 assert
  3. 使用:代替=
  4. 制作一个 class 扩展 TickerProvider 因为它是 abstract class。我以myTickerProvider为例。
AppTabController appTabController = new AppTabController(mLength:10, mVsync:new myTickerProvider());

class TabController extends ChangeNotifier {
  int length;
  TabController({
    int initialIndex = 0,
    @required this.length,
    @required TickerProvider vSync
  }) : assert(length != null),
       assert(vSync != null);
} //end of TabController

class AppTabController extends TabController {

  AppTabController({int mInitialIndex,
      int mLength,
      TickerProvider mVsync}):super(length: mLength, vSync: mVsync);
}


class myTickerProvider extends TickerProvider{
  @override
  Ticker createTicker(onTick) {
    // TODO: implement createTicker
    return null;
  }
}

@RahulLohra

如果您使用自己的 TickerProvider(如 @yahocho 示例),您将需要实施正确的抽象方法createTicker,如下:

import 'package:flutter/foundation.dart';
import 'package:flutter/scheduler.dart';

class MyTickerProvider extends TickerProvider{
  @override
  Ticker createTicker(onTick) =>
      Ticker(onTick, debugLabel: kDebugMode ? 'created by $this' : null);
}

备注:

  • 名称 class 使用 UpperCamelCase。 (请参阅 Effective Dart 准则)
  • 如果你在createTickerreturn null,每次你都会在日志中看到一个错误运行动画。