推广

Flutter获取Widget的大小位置信息以及实现自定义布局

iseeyu2年前 (2024-02-22)推广127

12.jpg

我们可以利用Stack或者CustomMultiChildLayout做,为了让大家更容易理解我这里就用Stack实现。

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class BevelAbgle extends StatefulWidget {
  final List<Widget> myChildren;
  BevelAbgle(this.myChildren);
  @override
  _BevelAbgleState createState() => _BevelAbgleState();
}

class _BevelAbgleState extends State<BevelAbgle> {
  final List<GlobalKey> globalKeys = [];
  final List<Widget> showChildren = [];
  bool show = false;
  List<Widget> getCustomChildren() {
    List<Widget> myChildren = [];
    for (var j = 0; j < widget.myChildren.length; j++) {
      var globalKey = GlobalKey();
      globalKeys.add(globalKey);
      myChildren.add(
        Row(
          key: globalKey,
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[widget.myChildren[j]],
        ),
      );
    }

    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      updateWeight();
      setState(() {
        show = true;
      });
    });
    return myChildren;
  }

  void updateWeight() {
    var widgetW = 0.0;
    var widgetH = 0.0;
    for (var i = 0; i < widget.myChildren.length; i++) {
      if (i > 0) {
        widgetW = widgetW + globalKeys[i - 1].currentContext.size.width;
        widgetH = widgetH + globalKeys[i - 1].currentContext.size.height;
      }
      showChildren.add(Positioned(
        left: widgetW,
        top: widgetH,
        child: widget.myChildren[i],
      ));
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Container(
        color: Colors.green,
        child: Stack(
          children: !show ? getCustomChildren() : showChildren,
        ),
      ),
    );
  }
}

这段代码的思路为:
1.建立一个GlobalKey数组对传递进来的Widget数组提前进行渲染知道并且都赋予GlobalKey保存到数组里。
2.对GlobalKey数组进行循环遍历然后拿到Width和Height进行重新排列绘制。

接下来我们来测试

import 'package:flutter/cupertino.dart';
import 'package:flutter_animation/component/BevelAngle.dart';

class BelevelAnglePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: BevelAbgle([
        Text('牛'),
        Image.network(
          'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww.gb324.com%2Fd%2Ffile%2Ftitlepic%2F2021-02-17%2F12%2F12044314839.png&refer=http%3A%2F%2Fwww.gb324.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1616221584&t=6b8f7f1c007d07bf98c03cfc3b6e0523',
          width: 150,
          height: 150,
        ),
        Text('气'),
        Image.network(
          'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww.gb324.com%2Fd%2Ffile%2Ftitlepic%2F2021-02-17%2F12%2F12044314839.png&refer=http%3A%2F%2Fwww.gb324.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1616221584&t=6b8f7f1c007d07bf98c03cfc3b6e0523',
          width: 50,
          height: 50,
        ),
        Text('冲13333444423211'),
        Text('冲13333444423211'),
        Image.network(
          'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww.gb324.com%2Fd%2Ffile%2Ftitlepic%2F2021-02-17%2F12%2F12044314839.png&refer=http%3A%2F%2Fwww.gb324.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1616221584&t=6b8f7f1c007d07bf98c03cfc3b6e0523',
          width: 50,
          height: 50,
        ),
        Text('天'),
      ]),
    );
  }
}

现在相信你对自定义布局有所了解了。

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/56508.html

相关文章

SEO推广营销要怎样快速获取流量。

SEO推广营销要怎样快速获取流量。

当前做网络营销是十分火爆的方式,如今很多行业网站优化推广排名的竞争也变得十分激烈,而今要快速在搜索引擎中获得一定的流量和权重,这仍需要使用一定的优化推广排名策略,那么SEO推广营销要怎样快速获取流量? 首先,我们要做好基本的事情。也就是网站的优化工作,做好各项站内优化的工作,使网站的关键...

信息流广告推广中,如何让用户快速成交?

信息流广告推广中,如何让用户快速成交?

当用户无法对产品本身建立充分理解的时候,后续的行为就无法进行。 认知产品是第一步,如果用户对于产品没有认知,往往再多的曝光也缺乏效果。 这个时候,最经常的做法,往往是:利用用户已经理解的事物,来解释未知事物。 比如当年第一代iPhone,乔布斯没有直接说未知概念“智能手机”,而是先说...

网站的外链是搜索引擎排名中最重要的。

网站的外链是搜索引擎排名中最重要的。

网站的优化过程中,网站的外链起到了非常重要的作用,作为网站在搜索引擎排名中最重要的一个要素,咱们就必须要知道如何来做有用和高质量网站外链办法,网站的外链可所以友情链接,站外锚文本链接。 一般的文字链接,总的来说这几类外链作用是为了为网站导入更多的链接,然后赢的搜索引擎信赖,给予更多的...

这就是差距|网络营销竞价总监需要招兵买马。

这就是差距|网络营销竞价总监需要招兵买马。

为什么在一个部门里,人家做了主管、经理、总监,你却永远是个职员?你有分析过原因吗?如果你是网络营销部门中的一名竞价员,最需要掌握的能力不过两种:时间管理和专业能力。 时间管理,指自身对日常工作内容的一个掌控。 专业能力,指自身工作能力,像数据分析、账户优化等。 很多竞价员都对于竞价的工作流程处...

教你李彦宏:未来十年。

教你李彦宏:未来十年。

新浪科技讯12月20日下午消息,第二届崇礼论坛上,百度创始人、董事长兼CEO李彦宏发表“智能经济时代:中国创新改变世界”主题演讲。他指出,过去十年是“互联网经济”时代,未来十年,“智能经济”将成为中国经济的标签。两种经济形态的差异将在人机交互、产业智能化、基础设施等多个方面充分展现。 李彦宏认为,...

除了死工资之外,你还有这3种赚钱方式

你好,我是小米,每天为你分享职场,和个人成长方法 ? 今天下午,有个读者给我发来私信,他说自己已经工作4年了,可月薪只有3700元,一直没能突破。一想到房子,车子,还有爱情,他就会很焦虑。马上就要奔三了,他不知道自己除了拿死工资,还能怎么办。 其实,类似这位读者的...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片