13

我在 Flutter 中遇到过几次已经相当大的墙了。动画或构建小部件,这取决于其他小部件来获取它们的大小/位置。

一些可能是我最糟糕的噩梦的例子:动态地将小部件彼此相邻。在 css 中我们有这个:

.root {
    display: flex;
    background: grey;
    padding: 4px;
}
.root > div {
  background: lightgrey;
  margin-right: 5px;
  padding: 5px;
}
<div class="root">
    <div>
         dynamic height
         <br/>
         dynamic width
         <br/>
         fat
         <br/>
         super fat
    </div>
    <div>
         dynamic width
         <br/>
         dynamic height
    </div>
</div>

  • 父母采用全宽(不重要)。
  • 父母取最大孩子的身高。
  • 身高较小的孩子适合父母
  • 孩子们彼此相邻

在颤振中,我认为我们不能一次获得所有 4 分。

现在,如果我们有 2 个这个列表和一个动画,其中一个元素从一个列表转到另一个列表怎么办?例子

在此处输入图像描述 在此处输入图像描述

另一个例子。如果我们想要一个SlideTransition与另一个没有共同点的小部件垂直对齐的完成怎么办?像这样 :

在此处输入图像描述

这些都是完全随机的例子。我不需要复制同样的东西。这里真正的问题是:是否有一种通用的方法来做类似的事情(获取屏幕尺寸/位置)?一些不是特定于这个用例的东西,以后很容易维护?

4

2 回答 2

12

要回答您最初的布局问题,您可以使用IntrinsicHeight小部件和CrossAxisAlignment.stretch. 它看起来像这样:

截屏

这是代码:

import 'package:flutter/material.dart';

void main() {
  runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Padding(
        padding: new EdgeInsets.all(10.0),
        child: new IntrinsicHeight(
          child: new Container(
            color: Colors.grey,
            padding: new EdgeInsets.all(4.0),
            child: new Row(
              mainAxisAlignment: MainAxisAlignment.start,
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                new Container(
                  padding: new EdgeInsets.all(5.0),
                  margin: new EdgeInsets.only(right: 5.0),
                  color: Colors.grey[200],
                  child: new Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      new Text('dynamic height'),
                      new Text('dynamic width'),
                      new Text('fat'),
                      new Text('super fat'),
                    ],
                  ),
                ),
                new Container(
                  padding: new EdgeInsets.all(5.0),
                  color: Colors.grey[200],
                  child: new Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      new Text('dynamic width'),
                      new Text('dynamic height'),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

要实现更高级的动画示例,我建议使用CustomMultiChildLayout来定位框。有关使用此类的高级动画示例,请参阅 Gallery 的动画演示:

截屏

于 2017-09-05T03:54:32.810 回答
-1
  • 父母取最大孩子的身高

您可以在行或列中使用 MainAxisSize.min,它用作父小部件的包装。

body: new Container(

 color: Colors.yellowAccent,

 child: new Row(

 mainAxisSize: MainAxisSize.min,

 children: [...],

 ),

)
  • 身高较小的孩子适合父母

FractionallySizedBox 是一个小部件(一个容器)& 根据它的 widthFactor 和 heightFactor,将设置所有子小部件。您可以将其视为一种比例值。因此,如果我们想拥有一个水平和垂直占用一半可用空间的容器,我们将执行以下操作:

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("FractionallySizedBox"),
      ),
      body: FractionallySizedBox(
        widthFactor: 0.5,
        heightFactor: 0.5,
        child: Container(
          // this container won't be larger than
          // half of its parent size
        ),
      ),
    );
  }
  • 孩子们彼此相邻

当您想将子项放置在彼此旁边时,每个颤动布局都会使用行和列。    

Row(
    children: [
          YourWidget(),
          YourWidget(),
          YourWidget(),
      ]
 )
于 2021-02-26T06:54:37.377 回答