仅在可变高度容器内使用正方形的颤振布局

Posted

技术标签:

【中文标题】仅在可变高度容器内使用正方形的颤振布局【英文标题】:Flutter Layout with Squares Only inside Variable-Height Containers 【发布时间】:2020-06-10 01:29:37 【问题描述】:

我想尝试创建一个高度可变的布局,但会占据整个屏幕的宽度。我想要左边的 2 个大正方形,左边的每个大正方形需要 2 个小正方形在正方形的右边。详情见紫色图片。

但是,在我保证内部小部件和组件将是正方形的情况下,我似乎无法做到这一点。有没有办法做到这一点?

如果可能的话,我是否也可以实现拖动和重新排列的能力(在我来回旋转方块时也可以缩放)?我正在尝试实现这种类型的布局以及从 6 张图片中的每一张进行旋转的能力,并且它将在该方面根据需要正确缩放(或拖放以重新排列每张图片的能力)。

我们将不胜感激!我在下面展示了我所做的,但在可变高度容器内甚至有方形项目似乎都不起作用。

return Container(
  child: AspectRatio(
    aspectRatio: 1.0,
    child: Row(
      mainAxisAlignment: MainAxisAlignment.start,
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        Expanded(
            flex: 7,
            child: Column(
              children: <Widget>[
                Expanded(
                  flex: 1,
                  child: Container(
                    color: Colors.grey,
                  ),
                ),
                Expanded(
                  flex: 1,
                  child: Container(
                    color: Colors.green,
                  ),
                ),
              ],
            )),
        Expanded(
          flex: 3,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Expanded(
                flex: 3,
                child: Container(
                  color: Colors.orange,
                ),
              ),
              Expanded(
                flex: 3,
                child: Container(
                  color: Colors.red,
                ),
              ),
              Expanded(
                flex: 3,
                child: Container(
                  color: Colors.orange,
                ),
              ),
              Expanded(
                flex: 3,
                child: Container(
                  color: Colors.red,
                ),
              )
            ],
          ),
        )
      ],
    ),
  ),
);

【问题讨论】:

【参考方案1】:

请尝试此代码。你应该从这里开始。它是响应式的,你只需要在屏幕太小时更多地调整对齐方式

import 'package:flutter/material.dart';

void main() 
  runApp(MyApp());


class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      theme: ThemeData.light(),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  


class MyWidget extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return FittedBox(
      child: Center(
        child: Container(
          height: MediaQuery.of(context).size.height,
          width: MediaQuery.of(context).size.width,
          padding: EdgeInsets.symmetric(vertical: 24.0, horizontal: 12.0),
          child: Column(
            children: <Widget>[
              Expanded(
                child: Row(
                  children: <Widget>[
                    Expanded(
                      flex: 7,
                      child: _buildSquare(Colors.purple),
                    ),
                    SizedBox(width: 12.0),
                    Expanded(
                      flex: 3,
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: [
                          Expanded(
                            child: Align(
                              alignment: Alignment.bottomCenter,
                              child: _buildSquare(Colors.purple),
                            ),
                          ),
                          SizedBox(height: 12.0),
                          Expanded(
                            child: _buildSquare(Colors.purple),
                          ),
                        ],
                      ),
                    ),
                  ],
                ),
              ),
              SizedBox(height: 12.0),
              Expanded(
                child: Row(
                  children: <Widget>[
                    Expanded(
                      flex: 7,
                      child: _buildSquare(Colors.purple),
                    ),
                    SizedBox(width: 12.0),
                    Expanded(
                      flex: 3,
                      child: Column(
                        children: [
                          Expanded(
                            child: _buildSquare(Colors.purple),
                          ),
                          SizedBox(height: 12.0),
                          Expanded(
                            child: _buildSquare(Colors.purple),
                          ),
                        ],
                      ),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  

  Widget _buildSquare(Color color) 
    return Center(
      child: AspectRatio(
        aspectRatio: 1.0,
        child: Container(
          decoration: BoxDecoration(
              color: color,
              border: Border.all(color: Colors.black, width: 3.0)),
        ),
      ),
    );
  

【讨论】:

我实际上尝试了上面的方法,但它似乎不适合我正在尝试做的事情,如下所示:1)左侧2个大方块2)每个大方块都伴随着右边 2 个相等的小方块。我尝试了上述方法,似乎无法在这种意义上正确布局,因为不可能使正方形遵循该模式。

以上是关于仅在可变高度容器内使用正方形的颤振布局的主要内容,如果未能解决你的问题,请参考以下文章

常用前端布局,CSS技巧介绍

固定大小容器内,不同比例的图片高度撑满,宽度居中裁剪

图像高度与宽度相同

iOS 自动布局:这可以用 IB 完成吗?

移动端布局,div按比例布局,宽度为百分比,高度和宽度一样,即让div为正方形

高度等于宽度的方形布局SquareLayout的最简单实现