Flutter - 如何让方形小部件连续占用其最大可能空间?

Posted

技术标签:

【中文标题】Flutter - 如何让方形小部件连续占用其最大可能空间?【英文标题】:Flutter - How can I make a square widget take up its maximum possible space in a row? 【发布时间】:2021-04-02 16:10:02 【问题描述】:

我有一个CustomPaint,它需要是一个 1:1 的正方形,我需要把它放在一个 Row 中。可用的水平和垂直空间可以变化,所以我需要正方形的长度和宽度都是最小的最大约束。

我怎样才能实现这种行为?

我已经尝试使用 LayoutBuilder 来解决这个问题:

Row(
  children: [
    ...,
    LayoutBuilder(
      builder: (context, constraints) 
        final size = min(constraints.maxWidth, constraints.maxHeight);
        return SizedBox(
          width: size,
          height: Size,
          child: CustomPaint(...),
        ),
      ,
    ),
  ]
),

但是,这不起作用,因为Row 提供了无限的水平约束 (maxWidth == double.infinity)。使用FittedBox 小部件也会因同样的原因而失败。

LayoutBuilder 包装在Expanded 小部件中为其提供了有界的最大宽度,但我需要在Row 中旁边有另一个小部件,因此这是不合适的。在这种情况下,Flexible 的行为也类似于 Expanded

【问题讨论】:

【参考方案1】:

我认为你可以从 AspectRatio 小部件中得到你想要的东西......如果你告诉它 1:1,那么它会尝试制作一个正方形,除非完全不可能。

【讨论】:

很遗憾,AspectRatio 使用高度来计算宽度。这在这种情况下是不合适的,因为它没有考虑任何宽度限制。 这可能没有按照书面形式回答问题,但它确实解决了我发现这个问题时遇到的问题。谢谢!【参考方案2】:

请尝试下面的代码,使用 Align 小部件将小部件限制为正方形:

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

final Color darkBlue = const Color.fromARGB(255, 18, 32, 47);

void main() 
  runApp(MyApp());


class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: MyWidget(),
      ),
    );
  


class MyWidget extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return Row(
      children: [
        Expanded(
          flex: 1,
          child: Container(),
        ),
        Expanded(
          flex: 2,
          child: LayoutBuilder(
            builder: (context, constraints) 
              final size = min(constraints.maxWidth, constraints.maxHeight);
              return Align(
                alignment: Alignment.centerRight,
                child: Container(
                  height: size,
                  width: size,
                  color: Colors.amber,
                ),
              );
            ,
          ),
        ),
        // Expanded(
        //   flex: 1,
        //   child: Container(),
        // ),
      ],
    );
  

【讨论】:

感谢您的建议,但正如我在问题中所说,我不能使用Expanded【参考方案3】:

我最终解决了这个问题,方法是将保持小部件保持在树上的职责。使用方形小部件的小部件更了解它们所显示的其他内容,并且更有能力为其提供正确的约束。

【讨论】:

仍然欢迎回答,因为我还没有真正找到我的问题的答案,我刚刚解决了这个问题。

以上是关于Flutter - 如何让方形小部件连续占用其最大可能空间?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter – 连续两个文本,左边一个优雅地溢出

防止小部件填充Flutter中扩展的祖先

如何让 Flutter 小部件适应不同的屏幕尺寸

如何方形裁剪 Flutter 相机预览

如何让内部有状态小部件接收到 Flutter 中的滚动事件?

Dart Flutter:如何从作用域模型运行动画?