Flutter:将小部件移动到另一个位置

时间:2019-10-20 09:25:13

标签: flutter

enter image description here

按下按钮时,我希望文本(文本向上移动)到达屏幕顶部,并在中间显示一个新文本。

我认为堆栈和定位的小部件可能有用。
我想要一个响应式应用程序。

import 'package:flutter/material.dart';

class MoveTest extends StatefulWidget {
  @override
  _MoveTestState createState() => _MoveTestState();
}

class _MoveTestState extends State<MoveTest> {
  bool moveIt = false;

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Column(
        children: <Widget>[
          Expanded(
            child: Center(
              child: Text(
                'Text to move up',
                style: TextStyle(fontSize: 30),
              ),
            ),
          ),
          (moveIt)
              ? Container(
                  child: Text(
                    'New Text in the center',
                    style: TextStyle(fontSize: 30),
                  ),
                )
              : Container(),
          Container(
            child: RaisedButton(
              onPressed: () {
                setState(() {
                  moveIt = true;
                });
              },
              child: Text('Move'),
            ),
          )
        ],
      ),
    );
  }
}

如何在不显示动画的情况下移动文本并显示带有某些文本的新窗口小部件?
我应该在定位小部件上使用堆栈吗?
如何使用堆栈/定位的小部件和响应式应用程序?

编辑:

您是否在不给予任何帮助的情况下给予否定票来获得幸福?残忍的心意

1 个答案:

答案 0 :(得分:1)

我将使用SlideTransition(https://api.flutter.dev/flutter/widgets/SlideTransition-class.html),在完成动画后,您可以使用提交给SlideTranslation的Animation对象控制该动画,然后可以在中间显示任何文本。

小代码示例可助您一臂之力。

import 'dart:async';

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter SlideTransition',
      theme: ThemeData.dark(),
      home: MyHomePage()
    );
  }
}

class MyHomePage extends StatefulWidget {

  @override
  MyHomePageState createState() => MyHomePageState();

}


class MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {

  AnimationController _animationController;
  Animation _animation;

  @override
  void initState() {
    _animationController =
        AnimationController(vsync: this, duration: Duration(seconds: 2));
    _animation = Tween<Offset>(begin: Offset(0, 0), end: Offset(0, -0.4)).animate(
        _animationController);

    _animationController.forward().whenComplete(() {
      // put here the stuff you wanna do when animation completed!
    });
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
        child: SlideTransition(
          position: _animation,
          child: Center(child: Text("My Text")),
        )
    );
  }
}