Flutter不会更新子窗口小部件

时间:2018-05-22 21:11:43

标签: ios dart flutter flutter-layout

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

children: <Widget>[
                    AspectRatio(
                      aspectRatio: 1.0,
                      child: Container(
                        padding: const EdgeInsets.all(16.0),
                        child: CircleWidget(_lastWindSpeed/10, _speed/10),
                      ))
                  ],
                ),

州将以

更新
setState

但是如果有新值,小部件不会更新。

有人在那里看到了这个问题吗?

课程是:

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));
  }
}

非常感谢。

2 个答案:

答案 0 :(得分:3)

如果您希望在CircleWidget的值发生更改时重新启动动画,则需要使用didUpdateWidget生命周期。 initState仅被调用一次,而每次重新创建相应的窗口小部件时都会调用didUpdateWidget - 请注意,如果父窗口小部件也重建,则值可能相同。

@override
void didUpdateWidget(CircleWidget oldWidget) {
  if (oldWidget._start != widget._start || 
    oldWidget._end != widget._end) {
    // values changed, restart animation.
    controller
      ..reset()
      ..forward();
  }
  super.didUpdateWidget(oldWidget);
}

答案 1 :(得分:2)

我想为上述给定解决方案发布替代解决方案。 如果您希望StatefulWidget在调用setState或在StreamBuilder内部时更新其基础数据,则应将UniqueKey传递给StatefulWidget构造函数。 调用setState时,fullter的行为是检查在StatefulWidget的情况下类型是否未更改,如果没有,则什么都不会更新。 如果将UniqueKey添加到构造器,则Flutter UI更新器将代替检查密钥。 希望对您有所帮助。

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
                      ))
                  ],
                ),
相关问题