Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 为什么';t容器是否尊重给定的大小? 导入“包装:颤振/材料.省道”; void main()=>runApp(MyApp()); 类MyApp扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ 返回材料PP( 标题:“颤振演示”, home:TestCode(), ); } } 类TestCode扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ 返回容器( 宽度:200, 身高:100, 颜色:颜色,红色, 子:容器( 宽度:100, 身高:100, 颜色:颜色。绿色, ), ); } }_Flutter_Dart - Fatal编程技术网

Flutter 为什么';t容器是否尊重给定的大小? 导入“包装:颤振/材料.省道”; void main()=>runApp(MyApp()); 类MyApp扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ 返回材料PP( 标题:“颤振演示”, home:TestCode(), ); } } 类TestCode扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ 返回容器( 宽度:200, 身高:100, 颜色:颜色,红色, 子:容器( 宽度:100, 身高:100, 颜色:颜色。绿色, ), ); } }

Flutter 为什么';t容器是否尊重给定的大小? 导入“包装:颤振/材料.省道”; void main()=>runApp(MyApp()); 类MyApp扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ 返回材料PP( 标题:“颤振演示”, home:TestCode(), ); } } 类TestCode扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ 返回容器( 宽度:200, 身高:100, 颜色:颜色,红色, 子:容器( 宽度:100, 身高:100, 颜色:颜色。绿色, ), ); } },flutter,dart,Flutter,Dart,事实上,这段代码非常简单。我只想显示一个200*100的红色立方体和一个100*100的绿色立方体 但是运行效果是全屏绿色的吗?为什么呢 接下来,我在TestCode中添加了一个Scaffold,如下所示 @覆盖 小部件构建(构建上下文){ 返回材料PP( 标题:“颤振演示”, home:Scaffold(主体:TestCode()), ); } 效果似乎更接近,显示了一个200*100的绿色长方体?为什么呢 接下来,我向第一个容器添加了一个对齐方式,如下所示 @覆盖 小部件构建(构建上下文)

事实上,这段代码非常简单。我只想显示一个200*100的红色立方体和一个100*100的绿色立方体

但是运行效果是全屏绿色的吗?为什么呢

接下来,我在
TestCode
中添加了一个
Scaffold
,如下所示

@覆盖
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
home:Scaffold(主体:TestCode()),
);
}
效果似乎更接近,显示了一个200*100的绿色长方体?为什么呢

接下来,我向第一个容器添加了一个对齐方式,如下所示

@覆盖
小部件构建(构建上下文){
返回容器(
对齐:alignment.topLeft,
宽度:200,
身高:100,
颜色:颜色,红色,
子:容器(
宽度:100,
身高:100,
颜色:颜色。绿色,
),
);
}

终于达到了预期的效果,为什么会这样,谁能解释,我必须弄清楚。

高度
宽度
属性被覆盖。您可以在本文中了解有关框约束的更多信息:

弗利特有很多可以完成任务的方法。在您的案例中,您将
容器
提供给
MaterialApp
home
属性。这将
容器的最小大小设置为屏幕大小
MaterialApp
希望他的孩子填满所有屏幕,以防止出现任何黑色像素。这是意料之中的行为。但是,您可以使用能够打破此约束的布局小部件,它可以是
中心
装配箱
或其他

带有
FittedBox
的示例:

class TestCode extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FittedBox(
      fit: BoxFit.scaleDown,
      child: Container(
        width: 200,
        height: 100,
        color: Colors.red,
        child: FittedBox(
          fit: BoxFit.scaleDown,
          child: Container(
            width: 100,
            height: 100,
            color: Colors.green,
          ),
        ),
      ),
    );
  }
}
输出:


高度
宽度
属性被覆盖。您可以在本文中了解有关框约束的更多信息:

弗利特有很多可以完成任务的方法。在您的案例中,您将
容器
提供给
MaterialApp
home
属性。这将
容器的最小大小设置为屏幕大小
MaterialApp
希望他的孩子填满所有屏幕,以防止出现任何黑色像素。这是意料之中的行为。但是,您可以使用能够打破此约束的布局小部件,它可以是
中心
装配箱
或其他

带有
FittedBox
的示例:

class TestCode extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FittedBox(
      fit: BoxFit.scaleDown,
      child: Container(
        width: 200,
        height: 100,
        color: Colors.red,
        child: FittedBox(
          fit: BoxFit.scaleDown,
          child: Container(
            width: 100,
            height: 100,
            color: Colors.green,
          ),
        ),
      ),
    );
  }
}
输出:


只需将您的代码更改为此。您必须指定对齐方式

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
  title: 'Flutter Demo',
  home: TestCode(),
  );
 }
}

class TestCode extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
width: 200.0,
height: 100.0,
color: Colors.red,
alignment: Alignment.center, // where to position the child
child: Container(
  width: 100.0,
  height: 100.0,
  color: Colors.green,
   ),
  );
 }
}

把你的代码改成这个。您必须指定对齐方式

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
  title: 'Flutter Demo',
  home: TestCode(),
  );
 }
}

class TestCode extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
width: 200.0,
height: 100.0,
color: Colors.red,
alignment: Alignment.center, // where to position the child
child: Container(
  width: 100.0,
  height: 100.0,
  color: Colors.green,
   ),
  );
 }
}

这是由颤振中的“紧约束与松约束”引起的

运输署;DR,宽度/高度是严格的限制(在这个意义上,只有一种可能性)

但您从未向框架指定如何在父级指定的200x200紧约束与子级的100x100紧约束之间切换

这会导致约束冲突。这两个小部件都有一种可能性,并且没有任何东西允许两者共存(比如对齐)

在这种情况下,父对象的约束总是成功的,因此我们最终得到一个200x200的正方形,子对象填充其父对象


如果那不是你想要的;然后,您应该将“紧”约束转换为“松”约束

松散约束是为子对象提供多种可能性的约束,通常可以消除冲突

引入松散约束的最常见方法是使用
对齐
(或
居中
容器的
对齐
属性)

因此,如果您写:

容器(
宽度:200,
身高:100,
颜色:颜色,红色,
儿童:中心(
子:容器(
宽度:100,
身高:100,
颜色:颜色。绿色,
),
),
);
然后在这种情况下,
Center
将充当父容器和子容器之间的中间地带

它会明白双方都想要不同的尺寸。它将通过在父对象中对齐子对象来解决冲突


现在,你可能会问,为什么需要这样做?为什么不能在这里隐式地添加对齐

这是因为在许多情况下,这种行为是所期望的

基本上,这确保了始终有一种方法可以自定义某个对象的大小(而不必在所有小部件上公开大量属性)

RaisedButton
为例。它不会暴露任何东西来改变它的大小,但我们可能希望它填满屏幕

在这种情况下,我们会写:

SizedBox.expand(
子项:RaisedButton(…),
)

由于我们前面解释的行为,当发生冲突时,父对象覆盖子对象大小,因此此代码将生成一个正确填充屏幕的
RaisedButton

这是由颤振中我们称之为“紧约束与松约束”的情况引起的

运输署;DR,宽度/高度是严格的限制(在这个意义上,只有一种可能性)

但您从未向框架指定如何在父级指定的200x200紧约束与子级的100x100紧约束之间切换

这会导致约束冲突。两个小部件都有一种可能性,并且没有任何东西可以让它们生活在一起(比如