是否有一种简单的(非layoutbuilder)方法来相对于屏幕大小(宽/高)来调整元素的大小?例如:我如何设置CardView的宽度为屏幕宽度的65%。

它不能在构建方法内部完成(显然),所以它必须推迟到构建后。是否有一个更好的地方来放置这样的逻辑?


当前回答

代码:

MediaQuery.of(context).size.width //to get the width of screen
MediaQuery.of(context).size.height //to get height of screen

其他回答

您可以构建具有Flexible或Expanded子元素的列/行,这些子元素的flex值加起来等于您想要的百分比。

您可能还会发现AspectRatio小部件很有用。

使用缩放器定义布局宽度和高度的百分比

dependencies:
      scaler: ^1.1.0+1

在pubspec中设置后。Yaml您可以通过以下代码使用此功能-

import 'package:scaler/scaler.dart';

导入后使用this -

import 'package:scaler/scaler.dart';

@override
Widget build(BuildContext context) {

  /**
   * Container with 25% width of screen 
   * and 25% height of screen
   */
  return   Container(
      height: Scaler.height(0.25, context),
      width: Scaler.width(0.25, context),
      child: Container()
  );
}

更详细地说

https://pub.dev/packages/scaler

我很惊讶没有人建议在2023年使用LayoutBuilder,它可以让你访问父类的宽度BoxConstraints.constraints。maxWidth,这是最通用的方法。

Expanded只能设置可用间距的百分比,但是如果你真的想要根据实际的父窗口小部件设置一个百分比,而不是整个屏幕宽度,如果在一行中有一个固定宽度的窗口小部件,甚至更复杂,如果你还想要一个Expanded来展开剩下的行呢?

.size MediaQuery.of(上下文)。宽度是相对于整个屏幕,而不是实际的父屏幕。

FractionallySizedBox的工作原理类似,但你不能把它放在Row

同时,该方法可以很好地模拟CSS %的度量单位。

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return  LayoutBuilder(
      builder: (context, BoxConstraints constraints) {
        return SizedBox(
          width: 470,
          child: Row(
            children: [
              SizedBox(
                width: 200,
                child: Icon(
                  Icons.link,
                  color: Colors.white,
                ),
              ),
              SizedBox(
                width: constraints.maxWidth*0.6,
                child: Icon(
                  Icons.message,
                  color: Colors.white,
                ),
              ),
              Expanded(
                child: Icon(
                  Icons.phone,
                  color: Colors.white,
                ),
              ),

              SizedBox(
                width: constraints.maxWidth*0.3,
                child: Icon(
                  Icons.account_balance,
                  color: Colors.white,
                ),
              ),
            ],
          ),
        );
      }
    );
  }
}

在本例中,我们将设置一个宽度为470的父小部件,其中包含Row。在Row中,一个元素的宽度固定为200,另一个元素的宽度为父元素的60%,另一个元素的宽度为470,另一个元素的宽度为同一父元素的30%,还有一个元素扩展任何剩余的空间。

您可以使用Align小部件。hightfactor和widthFactor参数乘以子部件的大小。下面是一个示例,它将创建一个具有%比例固定高度的小部件

         Align(
            alignment: Alignment.topCenter,
            heightFactor: 0.63,
            widthFactor: ,
            child: Container(
              width: double.infinity,
            ),

FractionallySizedBox也可能有用。 你也可以直接从MediaQuery.of(context)中读取屏幕宽度。大小,并在此基础上创建一个大小框

MediaQuery.of(context).size.width * 0.65

如果你真的想把屏幕的大小设置成一小部分不管布局是什么。