当可选参数之一不是成员变量并且它是必需的时,如何扩展 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
因为:
vsync
不是TabController
的成员变量
TabController
构造函数本身有一些断言,如果没有传递所需的参数,它就会崩溃。
这些是编译错误:
- 错误:未定义命名参数
vsync
this.length
需要成员变量。
@required
需要 assert
- 使用
:
代替=
- 制作一个 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 准则)
- 如果你在
createTicker
中return null
,每次你都会在日志中看到一个错误运行动画。
这是代码。我们有一个 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
因为:
vsync
不是TabController
的成员变量
TabController
构造函数本身有一些断言,如果没有传递所需的参数,它就会崩溃。
这些是编译错误:
- 错误:未定义命名参数
vsync
this.length
需要成员变量。@required
需要assert
- 使用
:
代替=
- 制作一个 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 准则)
- 如果你在
createTicker
中return null
,每次你都会在日志中看到一个错误运行动画。