Я пытаюсь повернуть виджет (который не является частью проблемы, поскольку он сам обрабатывает поворот с помощью параметра конструктора) на основе анимации, которая интерполирует между предыдущей позицией вращения новую, полученную с помощью функции плагина.Значение этой функции (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
.Как мне этого добиться?
Заранее спасибо