Flutter   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了dart – Flutter Nested Widget Callback / Async Questions大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_197_0@
@H_197_0@
Yueh Chou发布的 Flutter issue

import 'package:Flutter/foundation.dart';
import 'package:Flutter/material.dart';


void main() {
  runApp(new MaterialApp(
      home: new Container(color: Colors.white,child: new RootWidget())));
}

class RootWidget extends StatelessWidget {
  FlipWidget mainFlipWidget;

  @override
  Widget build(BuildContext context) {
    mainFlipWidget = new FlipWidget(
      frontWidget: frontWidget,BACkWidget: new BACkWidget(
        onPressedButton: () {
          _flipMainButton();
        },),);
    return new Center(child:mainFlipWidget);
  }

  _flipMainButton() {
    mainFlipWidget.doTheFlip();
  }
}

class BACkWidget extends StatefulWidget {
  BACkWidget({
    this.onPressedButton,});

  final VoidCallBACk onPressedButton;
   Widget buttonFlipWidget;
  _BACkWidgetState createState() => new _BACkWidgetState();
}

class _BACkWidgetState extends State<BACkWidget> {

  @override
  Widget build(BuildContext context) {
    widget.buttonFlipWidget = new Container(
      height: 180.0,color: Colors.greY[200],child:new FlatButton(
        onPressed: () {
          triggerCb();
        },child: new Text('Press me'),);
    return widget.buttonFlipWidget;
  }

  triggerCb() {
      widget.onPressedButton();
  }
}

class FlipWidget extends StatefulWidget {
  FlipWidget({
    @required this.frontWidget,@required this.BACkWidget,});

  final Widget frontWidget;
  final Widget BACkWidget;
  final _FlipWidgetState _state = new _FlipWidgetState();

  doTheFlip () {
    _state.doTheFlip();
  }

  _FlipWidgetState createState() => _state;
}

class _FlipWidgetState extends State<FlipWidget> with TickerProviderStatemixin {
  AnimationController _controller;
  Animation<double> _frontScale;
  Animation<double> _BACkScale;

  void initState() {
    super.initState();
    _controller = new AnimationController(vsync: this,duration: const Duration(milliseconds: 1500),);
    _frontScale = new Tween(
      begin: 1.0,end: 0.0,).animate(new CurvedAnimation(parent: _controller,curve: new Interval(0.0,0.5,curve: Curves.easeIn),));
    _BACkScale = new CurvedAnimation(
      parent: _controller,curve: new Interval(0.5,1.0,curve: Curves.eaSEOut),);
  }

  @override
  Widget build(BuildContext context) {
//    ThemeData theme = Theme.of(context);
    return new Scaffold(
      body: new Center(
        child: new Stack(
          children: [
            new AnimatedBuilder(
              child: widget.frontWidget,animation: _BACkScale,builder: (BuildContext context,Widget child) {
                final Matrix4 transform = new Matrix4.identity()
                  ..scale(_BACkScale.value,1.0);

                return new Transform(
                  transform: transform,alignment: FractionalOffset.center,child: child,);
              },new AnimatedBuilder(
                child: widget.BACkWidget,animation: _frontScale,Widget child) {
                  final Matrix4 transform = new Matrix4.identity()
                    ..scale(_frontScale.value,1.0);
                  return new Transform(
                    transform: transform,);
                }
            ),],);
  }

  doTheFlip() {
    setState(() {
      if (_controller.isCompleted || _controller.veLocity > 0)
        _controller.reverse();
      else
        _controller.forWARD();
    });
  }
}

final Widget frontWidget = new Container(
  color: Colors.white,height: 180.0,child: new column(
    children: [
      new Text("Front Side of the card")
    ],);

解决方法

您应该对此代码进行一些更改.

> RootWidget应该是有状态的.将翻转状态存储在那里.
> BACkWidget应该是无状态的.它所要做的就是通知RootWidget按下按钮.
> FlipWidget应检测使用didupdateWidget翻转的更改.
>不要将状态存储到Widget的成员变量中,并且如果可以避免,请避免将mutator方法放在State上…这通常表明您需要将状态存储在窗口小部件树中并通过它与构造函数参数.

Widget Framework Tourinteractivity tutorial中了解有关StatefulWidget和StatelessWidget的更多信息.

@L_403_4@

import 'package:Flutter/foundation.dart';
import 'package:Flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new Container(
      color: Colors.white,child: new RootWidget(),));
}

class RootWidget extends StatefulWidget {
  @override
  _RootWidgetState createState() => new _RootWidgetState();
}

class _RootWidgetState extends State<RootWidget> {
  bool _flipped = false;

  @override
  Widget build(BuildContext context) {
    return new Center(
      child: new FlipWidget(
        flipped: _flipped,frontWidget: new Container(
          color: Colors.white,child: new column(
            children: [
              new Text("Front Side of the card")
            ],BACkWidget: new BACkWidget(
          onPressedButton: () {
            setState(() {
              _flipped = !_flipped;
            });
          },);
  }
}

class BACkWidget extends StatelessWidget {
  BACkWidget({
    this.onPressedButton,});
  final VoidCallBACk onPressedButton;

  @override
  Widget build(BuildContext context) {
    return new Container(
      height: 180.0,child:new FlatButton(
        onPressed: onPressedButton,);
  }
}

class FlipWidget extends StatefulWidget {
  FlipWidget({
    @required this.frontWidget,@required this.flipped,});

  final Widget frontWidget;
  final Widget BACkWidget;
  final bool flipped;

  @override
  _FlipWidgetState createState() => new _FlipWidgetState();
}

class _FlipWidgetState extends State<FlipWidget> with TickerProviderStatemixin {
  AnimationController _controller;
  Animation<double> _frontScale;
  Animation<double> _BACkScale;

  @override
  void initState() {
    super.initState();
    _controller = new AnimationController(
      vsync: this,duration: const Duration(milliseconds: 1500)
    )..value = widget.flipped ? 1.0 : 0.0;
    _frontScale = new Tween(
      begin: 1.0,);
  }

  @override
  void didupdateWidget(FlipWidget oldWidget) {
    if (widget.flipped != oldWidget.flipped) {
      if (widget.flipped) {
        _controller.forWARD();
      } else {
        _controller.reverse();
      }
    }
    super.didupdateWidget(oldWidget);
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Center(
        child: new Stack(
          children: [
            new AnimatedBuilder(
              child: widget.frontWidget,);
  }
}
@H_607_29@
@H_197_0@

大佬总结

以上是大佬教程为你收集整理的dart – Flutter Nested Widget Callback / Async Questions全部内容,希望文章能够帮你解决dart – Flutter Nested Widget Callback / Async Questions所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:asynccallbackdartnestedquestionswidget
猜你在找的Flutter相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap