Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 如何公开StatefulWidget的方法?_Dart_Flutter - Fatal编程技术网

Dart 如何公开StatefulWidget的方法?

Dart 如何公开StatefulWidget的方法?,dart,flutter,Dart,Flutter,假设我想构建一个名为MySlideWidget的StatefulWidget,它提供一个公共实例方法:animate 当我按下MySlideWidget父级上的按钮时,我可以调用MySlideWidget的animate方法来触发MySlideWidget的内部幻灯片转换 用法如下所示: class MySlideWidgetDemo extends StatelessWidget { @override Widget build(BuildContext context) {

假设我想构建一个名为MySlideWidget的StatefulWidget,它提供一个公共实例方法:animate

当我按下MySlideWidget父级上的按钮时,我可以调用MySlideWidget的animate方法来触发MySlideWidget的内部幻灯片转换

用法如下所示:

class MySlideWidgetDemo extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    MySlideWidget mySlideWidget = new MySlideWidget();

    return new Scaffold(
        body: mySlideWidget,
        floatingActionButton: new FloatingActionButton(
          onPressed: () {
            mySlideWidget.animate();
          },
          tooltip: 'Start',
          child: new Icon(Icons.add),
        ));
  }
}
我想知道的是如何在MySlideWidget中封装AnimationController和_controller.forward的实现,这样MySlideWidget的用户就可以简单地调用animate了

这可能吗?或者,在flifter中进行封装的理想方法是什么?

您应该使用并将其传递给SlideTransition。然后在需要时呼叫controller.forward

以下是示例:

    class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {

  AnimationController _controller;
  Animation<FractionalOffset> _slideTransitionPosition;

  @override
  initState() {
    super.initState();

    _controller = new AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 2000),
    );

    _slideTransitionPosition = new FractionalOffsetTween(
      begin: const FractionalOffset(0.0, -1.0),
      end: const FractionalOffset(0.0, 10.0),
    ).animate(new CurvedAnimation(
      parent: _controller,
      curve: Curves.fastOutSlowIn,
    ));
  }

  void _onPress() {
    _controller.forward();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new Container(
        child: new SlideTransition(
          position: _slideTransitionPosition,
          child: new Container(
            color: Colors.red,
            width: 100.0,
            height: 100.0,
          ),
        ),
      ),
      floatingActionButton: new FloatingActionButton(
        onPressed: _onPress,
        tooltip: 'Start',
        child: new Icon(Icons.add),
      ),
    );
  }
}

你也可以在

中找到例子谢谢你的回复,我已经更新了我的问题,以便更准确地描述。简单地说,我想知道如何将动画实现封装在StatefulWidget中。我明白了。在这种情况下,可以将其用作Form和FormState的参考实现。StatefulWidget及其状态公开了方法save。所以你们需要得到正确的状态实例并在那个里触发动画。