Я пытаюсь вызвать простую анимацию lo go через 2 контейнера. Это упрощенная версия того, что мне нужно реализовать в большом проекте с несколькими контейнерами. Я получаю положение обоих контейнеров, используя глобальные ключи, а затем передаю их как параметры виджета анимации. Я не могу заставить анимацию работать. С другой стороны, если я передам параметры, найденные в документации по slideTransition, я смогу получить анимацию. Пожалуйста, помогите, где я иду не так. Позиции, которые я получаю: Смещение (107,0, 474,0) Смещение (107,0, 100,0)
import 'package:flutter/material.dart';
class MyStatefulWidget extends StatefulWidget {
final Offset start, end;
MyStatefulWidget(this.start,this.end);
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> with SingleTickerProviderStateMixin {
AnimationController _controller;
Animation<Offset> _offsetAnimation;
@override
void initState() {
Offset q = widget.start;
Offset r = widget.end;
print(widget.start.toString()+" "+widget.end.toString());
super.initState();
_controller = AnimationController(duration: const Duration(seconds: 3), vsync: this);
_offsetAnimation = Tween<Offset>(begin: Offset.zero, end:Offset(1.7 ,1.2)).animate(_controller);
_controller.forward();
}
@override
void dispose() {
super.dispose();
_controller.dispose();
}
@override
Widget build(BuildContext context) {
return SlideTransition(
position: _offsetAnimation,
child: FittedBox(
fit: BoxFit.scaleDown,
child: Container(
height: 20,
width: 20,
decoration: BoxDecoration(shape: BoxShape.circle, color: Colors.black),
),
),
);
}
}
class OverlayExample extends StatelessWidget {
GlobalKey _redKey = new GlobalKey();
GlobalKey _blueKey = new GlobalKey();
Offset _getPos(GlobalKey key){
RenderBox renderBox = key.currentContext.findRenderObject();
return renderBox.localToGlobal(Offset.zero);
}
showOverlay(BuildContext context,Offset start, Offset end) async {
print(start);
OverlayState overlayState = Overlay.of(context);
OverlayEntry overlayEntry = OverlayEntry(
builder: (context) => MyStatefulWidget(start,end),
);
overlayState.insert(overlayEntry);
await Future.delayed(Duration(seconds: 10));
overlayEntry.remove();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "Flutter Animations",
home: Scaffold(
appBar: AppBar(title: Text("Flutter Animations")),
body: Align(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween ,
children: <Widget>[
Container(
key : _blueKey,
height: 100,
width: 200,
color: Colors.blue,
),
Container(
key :_redKey,
height: 100,
width: 200,
color: Colors.red,
),
Builder(builder: (context) {
return RaisedButton(
onPressed: () {
showOverlay(context,_getPos(this._redKey),_getPos(this._blueKey));
},
child: Text("Show Notification", style: TextStyle(color: Colors.white)),
color: Colors.orange,
);
}),
],
),
)));
}
}
void main() => runApp(OverlayExample());```