Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Flutter如何从另一个小部件访问AnimationController方法

Flutter如何从另一个小部件访问AnimationController方法
EN

Stack Overflow用户
提问于 2021-04-05 10:37:45
回答 1查看 65关注 0票数 1

我正在用flutter构建一个国际象棋时钟应用程序。我有一个主页,上面有两个名为blackBox和whiteBox的容器小部件,它们都显示计时器。我在两个小部件上都使用了动画控制器来控制计时器。

我喜欢做的是,当我点击白色容器时,我想要停止whiteController动画并开始blackController动画,反之亦然。但我不知道如何在blackBox小部件中访问whiteController及其方法。我在下面分享我的代码的一个最小版本

HomePage

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        BlackBox(),
        WhiteBox(),
      ],
    );
  }
}

BlackBox小部件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class BlackBox extends StatefulWidget {
  const BlackBox({
    Key key,
  }) : super(key: key);

  @override
  _BlackBoxState createState() => _BlackBoxState();
}

class _BlackBoxState extends State<BlackBox>
    with SingleTickerProviderStateMixin {
  AnimationController blackController;
  @override
  void initState() {
    blackController = AnimationController(
      vsync: this,
      duration: Duration(seconds: 60),
    );
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Expanded(
      child: GestureDetector(
        onTap: () {
          blackController.forward(from: blackController.value);
        },
        child: Container(
          color: Colors.amber,
        ),
      ),
    );
  }
}

WhiteBox小部件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class WhiteBox extends StatefulWidget {
  const WhiteBox({
    Key key,
  }) : super(key: key);

  @override
  _WhiteBoxState createState() => _WhiteBoxState();
}

class _WhiteBoxState extends State<WhiteBox> with TickerProviderStateMixin {
  AnimationController whiteController;
  @override
  void initState() {
    whiteController = AnimationController(
      vsync: this,
      duration: Duration(seconds: 60),
    );
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Expanded(
      child: GestureDetector(
        onTap: () {
          whiteController.forward(from: whiteController.value);
        },
        child: Container(
          color: Colors.red,
        ),
      ),
    );
  }
}
EN

回答 1

Stack Overflow用户

发布于 2021-04-05 14:27:07

我不知道这是最好的解决方案。但是你可以通过这种方式来实现你的目标。

找到下面的代码片段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
  AnimationController _blackController;
  AnimationController _whiteController;

  @override
  void initState() {
    _blackController = AnimationController(
      vsync: this,
      duration: Duration(seconds: 60),
    );
    _whiteController = AnimationController(
      vsync: this,
      duration: Duration(seconds: 60),
    );
    _blackController.addListener(_rebuild);
    _whiteController.addListener(_rebuild);
    super.initState();
  }

  void _rebuild() {
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Column(
        children: [
          BlackBox(
            whiteController: _whiteController,
            blackController: _blackController,
          ),
          WhiteBox(
            whiteController: _whiteController,
            blackController: _blackController,
          ),
        ],
      ),
    );
  }

  @override
  void dispose() {
    _blackController.removeListener(_rebuild);
    _whiteController.removeListener(_rebuild);
    super.dispose();
  }
}

黑盒:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class BlackBox extends StatefulWidget {
  const BlackBox({Key key, this.blackController, this.whiteController})
      : super(key: key);

  final AnimationController blackController;
  final AnimationController whiteController;

  @override
  _BlackBoxState createState() => _BlackBoxState();
}

class _BlackBoxState extends State<BlackBox> {
  @override
  Widget build(BuildContext context) {
    return Expanded(
      child: GestureDetector(
        onTap: () {
          widget.whiteController.stop();
          widget.blackController.forward(from: widget.blackController.value);
        },
        child: Container(
          color: Colors.amber,
          alignment: Alignment.center,
          child:
              Text(widget.blackController.value.toStringAsFixed(2).toString()),
        ),
      ),
    );
  }
}

白盒:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class WhiteBox extends StatefulWidget {
  const WhiteBox({
    Key key,
    this.blackController,
    this.whiteController,
  }) : super(key: key);

  final AnimationController blackController;
  final AnimationController whiteController;

  @override
  _WhiteBoxState createState() => _WhiteBoxState();
}

class _WhiteBoxState extends State<WhiteBox> {
  @override
  Widget build(BuildContext context) {
    return Expanded(
      child: GestureDetector(
        onTap: () {
          widget.blackController.stop();
          widget.whiteController.forward(from: widget.whiteController.value);
        },
        child: Container(
          color: Colors.red,
          alignment: Alignment.center,
          child:
              Text(widget.whiteController.value.toStringAsFixed(2).toString()),
        ),
      ),
    );
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66951685

复制
相关文章
C# 中的 Out 和 Ref 及Params 参数
out 和ref 参数 经常用来通过方法传递参数来获取值,当您的方法不只有一个返回值的时候,这两个参数就发挥作用了。ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。  在这篇文章里,我将解释如何在c#应用中使用这两个参数。   1、out 参数   out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。   public class mathClass { public static int TestOu
跟着阿笨一起玩NET
2018/09/18
1.2K0
ref和out的区别在c#中 总结
 ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。简单点说就是,使用了ref和out的效果就几乎和C中使用了指针变量一样。它能够让你直接对原数进行操作,而不是对那个原数的Copy进行操作。 还是以例子来说明吧; 1. ref: int i =0; 有函数fun(ref i)和fun(i) 它们的函数体都是{ i = 3;},那么在执行以下两段代码后: (1)int i = 0; fun(i); System.Console.WriteLi
小小许
2018/09/20
4320
C#中ref和out的区别使用
ref 关键字会导致参数通过引用传递,而不是通过值传递。 通过引用传递的效果是,对所调用方法中的参数进行的任何更改都反映在调用方法中。 例如,如果调用方传递本地变量表达式或数组元素访问表达式,所调用方法会将对象替换为 ref 参数引用的对象,然后调用方的本地变量或数组元素将开始引用新对象。
vv彭
2020/10/27
1.2K0
C#中ref和out用法简介
ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。   使用ref前必须对变量赋值,out不用。   out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。   区别可以参看下面的代码应该就明白了:
zls365
2021/12/06
1.3K0
C# ref与out
ref参数是引用,out参数为输出参数。 我写一个控制台的程序来说明一下两者的特点和区别: 1 class Program 2 { 3   public static void RefMethod( ref int i) //参数使用了ref关键字 4   { 5     i++; 6   } 7   public static void OutMethod(out int i) //参数使用了out关键字 8   { 9     i = 0; //out参数规定,参数在方法体内必须被初始
拾点阳光
2018/05/10
8820
ref 和 out 的区别
ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递。对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别。
kdyonly
2023/03/03
4220
如何使用out、ref和parms?
【摘要】C#中有三个高级参数,分别是out,ref,params, 你会用吗?
高一峰
2020/09/22
9730
如何使用out、ref和parms?
在C#中ref和out具体怎么使用?在什么情况下使用?
ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。   使用ref前必须对变量赋值,out不用。   out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。   区别可以参看下面的代码应该就明白了:
zls365
2020/08/19
2.8K0
C#基础知识 之 ✨ ref 和 out 之间的江湖趣闻
按照国际惯例,要了解一个东西的时候,首先明白它是什么,然后明白它能做什么,最后要知道为什么。 所以在介绍ref和out之前要先简单了解一下什么是引用参数与输出参数,因为使用ref和out要有所了解
呆呆敲代码的小Y
2021/08/12
2.4K0
C# ref,params,out 修饰符
out 和ref 相反,调用方法参数被out修饰的方法时,被out修饰的参数变量,在声明后可以不用赋值,但是在方法体内必须赋值,使用方法如下:
多凡
2020/06/16
3820
通俗易懂的ref和out区别
ref 和 out 是C#开发中经常用到的两个关键字,但是很多人没有搞清楚这两个关键字的具体区别,下面我们来说一下这两个关键的区别。
喵叔
2020/09/08
9260
通俗易懂的ref和out区别
C# ref实例讲解
C#有两种参数传递方式:传值和引用,传值就是变量的值,而引用则是传递的变量的地址;
zls365
2020/08/19
5410
C# ref实例讲解
ref与out
其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别.
wfaceboss
2019/04/08
7570
c#基础系列3---深入理解ref 和out
在上篇文章深入理解值类型和引用类型的时候,有的小伙伴就推荐说一说ref和out 关键字,昨天晚上彻夜难眠在想是否要谈一下呢,因为可谈的不是太多,也可能是我理解的不够深刻。
架构师修行之路
2019/07/23
1.4K0
C# ref与out关键字解析
简介:ref和out是C#开发中经常使用的关键字,所以作为一个.NET开发,必须知道如何使用这两个关键字. 1、相同点 ref和out都是按地址传递,使用后都将改变原来参数的数值。 2、ref关键字 (1)、使用ref关键字的注意点: i、方法定义和调用方法都必须显式使用 ref 关键字 ii、传递到 ref 参数的参数必须初始化,否则程序会报错 iii、通过ref的这个特性,一定程度上解决了C#中的函数只能有一个返回值的问题 (2)、代码示例: using System; using System.Col
郑小超.
2018/01/26
5640
.net里的ref、out、params参数。
1、ref參數     class Program     {         static void Main(string[] args)         {             int a = 10;             int b = 5;             ChangeNumValue(ref a, ref b);             Console.WriteLine(a + " " + b);             Console.ReadKey();         }
指尖改变世界
2018/08/31
7630
索引器和ref、out关键字
在一个类中,我们可以定义一个索引器,它可以让我们在外部像访问数组元素一样访问类的属性成员。
宿春磊Charles
2022/03/29
2890
索引器和ref、out关键字
RPM索引在Artifactory中是如何工作
RPM是用于保存和管理RPM软件包的仓库。我们在RHEL和Centos系统上常用的Yum安装就是安装的RPM软件包,而Yum的源就是一个RPM软件包的仓库。JFrog Artifactory是成熟的RPM和YUM存储库管理器。JFrog的官方Wiki页面提供有关Artifactory RPM存储库的详细信息。
JFrog杰蛙科技
2020/07/03
2K0
RPM索引在Artifactory中是如何工作
2019-11-22-C++CLI的Ref和Out使用
C++/CLI 是一种.NET语言,因此其可以像C#一样使用Ref和Out为函数参数进行标识。
黄腾霄
2020/06/10
7840
点击加载更多

相似问题

Android Studio进度条

20

两个给定日期之间的天数

20

两个给定日期之间的随机日期

30

Android Studio -创建模拟进度条

11

计算Android Studio两个位置之间的距离

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文