Анимированное наложение не отображается во флаттере - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь вызвать простую анимацию 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());```


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...