Флаттер не обновляет подвиджет - PullRequest
0 голосов
/ 23 мая 2018

У меня есть виджет, который содержит подвиджет.Он получает последнее и новое значение в методе сборки следующим образом:

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

Большое спасибо.

1 Ответ

0 голосов
/ 23 мая 2018

Если вы хотите, чтобы ваша анимация перезапускалась при изменении значений 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);
}
...