Интерполяция анимации флаттера - PullRequest
2 голосов
/ 06 марта 2019

Я пытаюсь повернуть виджет (который не является частью проблемы, поскольку он сам обрабатывает поворот с помощью параметра конструктора) на основе анимации, которая интерполирует между предыдущей позицией вращения новую, полученную с помощью функции плагина.Значение этой функции (FlutterCompass.events.listen) обновляется асинхронно на регулярной основе и каждый раз перестраивает объект Tween для представления обновления положения виджета.Вот мой код:

import 'package:flutter/material.dart';
import 'package:flutter/animation.dart';
import 'package:flutter_compass/flutter_compass.dart';
import 'package:compass_test/compass.dart';

void main() => runApp(new MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> with SingleTickerProviderStateMixin{
  double _direction;
  double _angle = 0.0;
  Animation<double> _animation;
  AnimationController _animationController;
  Tween<double> _tween;

  @override
  void initState() {
    super.initState();
      _animationController =
          AnimationController(duration: Duration(milliseconds: 400), vsync: this);
      _tween = Tween<double>(begin: 0.0, end: 0.0);
      _animation = _tween.animate(_animationController)
          ..addListener(() {
              setState(() {
                _angle =_animationController.value;
              });
          });
    _direction = 0;

    FlutterCompass.events.listen((double direction) {
      print(_animationController.status);
      if(_direction !=direction){
        _tween = Tween<double>(
          begin: _direction,
          end: direction);
        _animationController.reset();
        _tween.animate(_animationController);
        _animationController.forward();
      }
      _direction = direction;
    });
  }

  @override
  void dispose(){
    _animationController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Column(
          children: <Widget>[
            Center(
              child: Container(
                margin: EdgeInsets.only(top: 100),
                child: Compass(height: 300, width: 300, angleToNorth: _angle)
              )
            )
          ],
        )
      ),
    );
  }
}

Однако, как я смог увидеть с помощью некоторой отладки, значения, возвращаемые с _animationController.value, варьируются только от 0,0 до 1,0, что я и не предполагалслучилось: я ожидал, что они изменятся от предыдущего значения _direction до нового значения direction.Как мне этого добиться?

Заранее спасибо

...