Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart `TabController构造函数中的vsync`属性_Dart_Tabcontrol_Flutter - Fatal编程技术网

Dart `TabController构造函数中的vsync`属性

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

据此:

我创建了自己的TabController实现:

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。看起来这可能是一个可选参数。