Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Flutter不更新子小部件

Flutter不更新子小部件
EN

Stack Overflow用户
提问于 2018-05-22 21:11:43
回答 2查看 8.3K关注 0票数 5

我有一个小部件,其中包含一个子小部件。它在build方法中获得最后一个值和新值,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
children: <Widget>[
                    AspectRatio(
                      aspectRatio: 1.0,
                      child: Container(
                        padding: const EdgeInsets.all(16.0),
                        child: CircleWidget(_lastWindSpeed/10, _speed/10),
                      ))
                  ],
                ),

状态将被更新为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setState

但如果存在新值,则小部件不会更新。

有没有人看到问题所在?

这个类是:

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

class CircleWidget extends StatefulWidget {
  final double _start;
  final double _finish;
  CircleWidget(this._start, this._finish);

  @override
  State<CircleWidget> createState() => new _CircleState();
}

class _CircleState extends State<CircleWidget> with SingleTickerProviderStateMixin{

  Animation<double> animation;
  double _fraction;

  @override
  void initState() {
    super.initState();
    var controller = AnimationController(duration: new Duration(milliseconds: 10), vsync: this);
    animation = Tween(begin: widget._start, end: widget._finish).animate(controller)
      ..addListener((){
        setState(() {
          _fraction = animation.value;
        });
      });
    controller.forward();
  }
  @override
  Widget build(BuildContext context) {
    return new CustomPaint(
        painter: new CirclePainter(_fraction));
  }
}

非常感谢。

EN

回答 2

Stack Overflow用户

发布于 2018-05-22 21:29:40

如果希望动画在CircleWidget的值更改时重新启动,则需要使用didUpdateWidget生命周期。initState只调用一次,而didUpdateWidget则在每次重新创建相应的小部件时调用-请注意,如果父小部件也重新构建,则这些值可能是相同的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@override
void didUpdateWidget(CircleWidget oldWidget) {
  if (oldWidget._start != widget._start || 
    oldWidget._end != widget._end) {
    // values changed, restart animation.
    controller
      ..reset()
      ..forward();
  }
  super.didUpdateWidget(oldWidget);
}
票数 15
EN

Stack Overflow用户

发布于 2020-07-03 03:15:02

我想发布上面给出的解决方案的替代解决方案。如果希望StatefulWidget在调用setState时或在StreamBuilder内部更新其底层数据,则应该将UniqueKey传递给StatefulWidget构造函数。当setState被调用时,fullter的行为是检查在StatefulWidget的情况下类型是否没有改变,如果不是,什么都不会被更新。如果将UniqueKey添加到构造器,flutter UI更新器将改为检查密钥。我希望这能帮到你。

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

class CircleWidget extends StatefulWidget {
  final double _start;
  final double _finish;
  CircleWidget(this._start, this._finish, Key:key):super(key:key); // <-- check this

  @override
  State<CircleWidget> createState() => new _CircleState();
}

class _CircleState extends State<CircleWidget> with SingleTickerProviderStateMixin{

  Animation<double> animation;
  double _fraction;

  @override
  void initState() {
    super.initState();
    var controller = AnimationController(duration: new Duration(milliseconds: 10), vsync: this);
    animation = Tween(begin: widget._start, end: widget._finish).animate(controller)
      ..addListener((){
        setState(() {
          _fraction = animation.value;
        });
      });
    controller.forward();
  }
  @override
  Widget build(BuildContext context) {
    return new CustomPaint(
        painter: new CirclePainter(_fraction));
  }
}



children: <Widget>[
                    AspectRatio(
                      aspectRatio: 1.0,
                      child: Container(
                        padding: const EdgeInsets.all(16.0),
                        child: CircleWidget(_lastWindSpeed/10, _speed/10, key: UniqueKey()), // <---- add UniqueKey as key param here to tell futter to check keys instead of types
                      ))
                  ],
                ),
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50476521

复制
相关文章
Flutter 入门指北之基础部件
原文:https://www.jianshu.com/p/8ddb16902ce6
陈宇明
2020/12/16
1.3K0
Flutter 中使用Chip 小部件【Flutter专题30】
本文是关于 Flutter 中的 Chip 小部件。我们将大致了解小部件的基本原理,然后通过代码来实现它。事不宜迟,让我们开始吧。
徐建国
2022/03/30
2.9K0
Flutter 中使用Chip 小部件【Flutter专题30】
Flutter 入门指北之滑动部件(超详细)
日常开发中,会遇到很多这种情况,许多界面不是一页就能够显示完的。那么这里提下可滑动的容器部件
陈宇明
2020/12/16
2.5K0
flutter热更新
要热更新flutter页面,我们首先要搞明白我们到底需要动态替换一些什么?因此这里需要对flutter构建的产物有一定的了解了,怕有些小伙伴不太明白,这里也简单的带一下;如上图所示,实际上,我们只需要copy一些aar文件,so文件到native工程lib目录,就可以已aar的方式来跑Flutter的页面了,这也是典型的已aar方式接入Flutter的模式。其中,libapp.so,注意在armeabi中没有,如果你的gralde配置这么写的,abiFilters "armeabi" 那么,copy armeabi-v7a下面的so到armeabi中,也是没有任何问题的,关于构建产物提取到原生工程就介绍到这里。
用户9414951
2022/01/25
3.1K0
Flutter 更新&升级
https://flutter-io.cn/posts/announcing-flutter-1-7-9.html
林小帅
2019/09/09
7K0
Flutter 更新&升级
10 个派上用场的 Flutter 小部件
尝试学习一门新语言可能会令人恐惧和厌烦。很多时候,我们希望我们知道早先存在的某些功能。在今天的文章中,我将告诉你我希望早点知道的最方便的几个Flutter小部件。
徐建国
2022/06/24
1.3K0
Flutter 3.7更新详解
新年伊始,由 Flutter 3.7 正式版来「打头阵」!我们与整个 Flutter 社区们继续在 Flutter 3.7 中优化了框架,包括创建自定义菜单栏和层叠式菜单、更好的国际化工具支持、新的调试工具以及其他功能和特性等。
CrazyCodeBoy
2023/03/28
3.2K0
Flutter 3.7更新详解
Flutter 2.10更新详解
Flutter 2.10 版已正式发布!虽然⾃ 上次稳定版本发布 以来还不到两个⽉,即使在这么短的时间内,Flutter官方也已处理和关闭了 1843 个 Issue,合并了来⾃全球 155 位贡献者的 1525 个 PR。
CrazyCodeBoy
2022/02/14
1.6K0
Flutter 2.10更新详解
Flutter 3.3更新详解
Flutter 3 是我们正式为全平台提供支持的一个重量级里程碑,距离它的发布仅过去了三个月,今天让我们有请 Flutter 3.3 正式版!近三个月我们并没有放慢更新迭代的速度——自 Flutter 3 发布以来,我们已经为 Flutter 合并了 5687 个拉取请求。
CrazyCodeBoy
2022/11/16
2.9K0
Flutter 3.3更新详解
Flutter 3更新详解
Flutter 3 实现了 Flutter 以移动端为中心扩展到多平台的产品规划,并在今年 Google I/O大会的主题演讲上正式发布,继Flutter 2.10支持Windows 之后,此次发布提供了对 macOS 和 Linux 桌面端的稳定版支持,同时包括 Firebase 集成的改进,增加了与生产力和性能相关的新特性,并对 Apple 芯片提供了支持。
CrazyCodeBoy
2022/05/30
3.6K0
Flutter 3更新详解
Flutter 小练习
学Flutter也有一段时间了,一直在学习理论,还没怎么做过练习。想起以前初学Android的时候做过的一个练手小玩具,今天决定用Flutter去实现一下子。核心东西是一个叫Ticker的东西,用来计时。以后项目中如果做短信验证倒计时的时候应该能用上吧。
坑吭吭
2018/08/31
1.2K0
Flutter 小练习
归档 | 自建 不蒜子 API
出现下图表示安装成功!(首次会同步 busuanzi 的数据,多次尝试属于正常状态) :
Zkeq
2022/05/18
9570
归档 | 自建 不蒜子 API
Flutter-常用组件(持续更新)Flutter-常用组件(持续更新)题纲:注:
相当于iOS开发中的给定尺寸的UIView。根据文档中的解释该控件会限制子控件的大小如果子控件允许的话。尤其是控件本身不好控制大小,则可以使用该控件来控制大小,列如:CircleAvatar。
用户8893176
2021/08/09
7390
子线程 真的不能更新UI ?
一般情况,我们在子线程直接操作UI,没有用handler切到主线程,就会报这个错。
胡飞洋
2020/07/23
1.3K0
子线程 真的不能更新UI ?
小程序中点击子元素事件而不触发父元素的点击事件
在测试小程序的时候,发现了这样的一个bug,点击子元素事件d的时候触发父元素的点击事件,从而执行父级的点击事件,跳转到了父级的点击事件的页面了。
王小婷
2019/02/21
6K0
小程序中点击子元素事件而不触发父元素的点击事件
Flutter中构建布局 顶
然后本指南回过头来解释Flutter的布局方法,并说明如何在屏幕上放置一个小部件。 在讨论如何水平和垂直放置小部件之后,会介绍一些最常见的布局小部件。
南郭先生
2018/08/14
43.1K0
Flutter中构建布局
                                                    顶
Flutte部件目录-基本部件(一)
一个容器首先用padding包围子组件(由decoration中出现的所有边框填满),然后将附加constraints应用于填充范围(将width和height作为约束合并(如果其中任一个非空)。然后container被 margin描述的额外的空白空间包围。
南郭先生
2018/08/14
7.5K0
Flutter —布局系统概述
最近,我决定专注于Flutter基础知识。这次,我试图更好地理解“布局系统的工作原理”,并回答以下问题:
老孟Flutter
2020/09/11
1.7K0
Flutter —布局系统概述
【译】Flutter架构综述
Flutter是一个跨平台的UI工具包,它的设计目的是允许跨iOS和Android等操作系统的代码重用,同时也允许应用程序直接与底层平台服务对接。其目标是让开发者能够交付在不同平台上感觉自然的高性能应用,在尽可能多的代码共享的同时,拥抱存在差异的地方。
用户1907613
2020/08/17
5.6K0
【译】Flutter架构综述
不蒜子与看板娘的矛盾
不蒜子统计访客量总是不显示,这个问题我差了很多资料,希望可以帮到大家!NexT 预置了不蒜子提供的网页计数功能。只需要在配置文件中启用即可!
故里[TRUE]
2023/04/12
2670
不蒜子与看板娘的矛盾

相似问题

Flutter setState不更新小部件

110

Flutter ListView:窗口小部件不更新

24

使用provider时Flutter小部件不更新

156

Flutter statefull小部件不更新svg图标

120

当父小部件更新时,有状态子小部件不更新

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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