Dart `TabController构造函数中的vsync`属性
据此: 我创建了自己的TabController实现:Dart `TabController构造函数中的vsync`属性,dart,tabcontrol,flutter,Dart,Tabcontrol,Flutter,据此: 我创建了自己的TabController实现: void main() { runApp(new MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => new _MyAppState(); } class _MyAppState extends State<MyApp> { TabController _tabControll
void main() {
runApp(new MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
TabController _tabController;
@override
void initState() {
super.initState();
_tabController = new TabController(vsync: this, length: choices.length);
}
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new Scaffold(
bottomNavigationBar: new Material(
color: Colors.blue,
child: new TabBar(
controller: _tabController,
isScrollable: false,
tabs: choices.map((Choice choice) {
return new Tab(
text: null,
icon: new Icon(choice.icon),
);
}).toList(),
),
),
appBar: new AppBar(
title: const Text('Swap'),
),
body: new TabBarView(
controller: _tabController,
children: choices.map((Choice choice) {
return new Padding(
padding: const EdgeInsets.all(16.0),
child: new ChoiceCard(choice: choice),
);
}).toList(),
),
),
);
}
}
void main(){
runApp(新的MyApp());
}
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>new_MyAppState();
}
类MyAppState扩展了状态{
TabController\u TabController;
@凌驾
void initState(){
super.initState();
_tabController=newtabcontroller(vsync:this,length:choices.length);
}
@凌驾
无效处置(){
_tabController.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回新材料PP(
家:新脚手架(
底部导航栏:新材质(
颜色:颜色,蓝色,
孩子:新的TabBar(
控制器:\ tab控制器,
isScrollable:错误,
选项卡:选项.map((选项){
返回新选项卡(
文本:空,
图标:新图标(choice.icon),
);
}).toList(),
),
),
appBar:新的appBar(
标题:常量文本(“交换”),
),
正文:新选项卡视图(
控制器:\ tab控制器,
子项:choices.map((Choice-Choice){
返回新的填充(
填充:常数边集全部(16.0),
儿童:新选择卡(选择:选择),
);
}).toList(),
),
),
);
}
}
第行:\u tabController=new tabController(vsync:this,length:choices.length)代码>我收到错误消息:
错误:无法将参数类型“\u MyAppState”分配给参数类型“TickerProvider”。(参数类型不可分配于[swap]lib/main.dart:24)
我的代码有什么问题?将带有TickerProviderStateMixin的添加到您的状态
的类声明末尾。正如前面回答的添加mixin
,TickerProviderStateMixin
应该完成这项工作,或者如果您只需要一个TickerProviderStateMixin
,也可以使用singletickerStateMixin
但是,TickerProviders
真正做的是什么
vsync
将一个TickerProvider
作为参数,这就是为什么我们使用SingleTickerProviderStateMixin
,正如命名的TickerProvider
提供的TickerProvider
所述,这意味着它会告诉我们的应用程序关于帧更新(或屏幕更新),这样,我们的AnimationController
就可以生成一个新值,并且我们可以重新绘制动画小部件。只需在扩展状态类末尾添加,并使用TickerProviderStateMixin
,如下所示:
class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
//...
}
class\u MyAppState使用TickerProviderStateMixin扩展状态{
//...
}
在语句末尾添加以下任何一个SingleTickerProviderStateMixin/TickerProviderStateMixin混合项,如下所示:
例如:
类_ListingViewState使用SingleTickerProviderStateMixin扩展状态
您所要做的就是添加到这个文件中-SingleTickerProviderStateMixin
旁边的State
,正如@Shubham Soni上面所说的那样
只需更改这一行:
_MyAppState extends State<MyApp>
\u MyAppState扩展状态
为此:
_MyAppState extends State<MyApp>
with SingleTickerProviderStateMixin
\u MyAppState扩展状态
使用SingleTickerProviderStateMixin
下面是如何做到这一点的完整示例
class MyApp extends StatefulWidget {
const MyApp({Key key}) : super(key: key);
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp>
with SingleTickerProviderStateMixin {
TabController tabController;
void initState() {
tabController =
TabController(length: tabsList.length, vsync: this, initialIndex: 0);
super.initState();
}
@override
Widget build(BuildContext context) {
// TODO: implement build
throw UnimplementedError();
}
}
类MyApp扩展StatefulWidget{
constmyapp({Key}):超级(Key:Key);
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态
使用SingleTickerProviderStateMixin{
TabController TabController;
void initState(){
选项卡控制器=
TabController(长度:tabsList.length,vsync:this,initialIndex:0);
super.initState();
}
@凌驾
小部件构建(构建上下文){
//TODO:实现构建
抛出未实现的错误();
}
}
这个问题非常笼统,所以需要更多描述
Vsync用于
- vsync是表示TickerProvider(即勾号)的属性
类似于时钟的滴答声,这意味着在每一个特定的持续时间
TickerProvider将呈现类状态并重新绘制对象。)
- vsync属性仅在构造函数上是必需的,当我们需要呈现组件或小部件以重新绘制和反映UI时,构造函数需要在每个特定的偏移时间呈现其类状态
- vsync可用于需要某些转换或动画才能重新渲染以绘制不同对象的类
内部实施
TabController({ int initialIndex = 0, @required this.length, @required TickerProvider vsync })
: assert(length != null && length >= 0),
assert(initialIndex != null && initialIndex >= 0 && (length == 0 || initialIndex < length)),
_index = initialIndex,
_previousIndex = initialIndex,
_animationController = AnimationController.unbounded(
value: initialIndex.toDouble(),
vsync: vsync,
);
TabController({int initialIndex=0,@required this.length,@required TickerProvider vsync})
:assert(长度!=null&&length>=0),
断言(initialIndex!=null&&initialIndex>=0&&(长度==0 | | initialIndex
TabController
在内部使用AnimationController
呈现选项卡栏状态就是这样。现在,在更改选项卡期间,我在控制台中获得了奇怪的日志:引发了另一个异常:“package:flatter/src/rendering/object.dart”:失败的断言:第2257行位置12:“fragment is _InterestingSemanticsFragment”:不正确。
听起来不相关,也许重新启动应用程序/升级您的颤振?如果使用StateMixin,您可能会遇到热重新加载问题,如果您这样做,请尝试使用TickerProviderStateMixin而不是SingleTickerProviderStateMixinIts。看起来这可能是一个可选参数。