Flutter 颤振代码在屏幕下方绘制矩形底线-原因(附示例)

Flutter 颤振代码在屏幕下方绘制矩形底线-原因(附示例),flutter,flutter-layout,flutter-canvas,Flutter,Flutter Layout,Flutter Canvas,为什么下方的直线在屏幕下方,即使我已经计算过了 代码: 尝试管理您的顶部和底部区域,以便进行凹槽或底部控制: MediaQuery是否能计算出整个屏幕,而不仅仅是小部件的大小。例如,从logicHeight中删除AppBar的大小。@Glen-有办法获得AppBar的大小吗?我还需要考虑MediaQuery中也提供的填充/视图插入)。您可以使用PreferredSize设置appBar大小。其他设置不确定。与其使用Container>FittedBox>SizedBox>CustomPaint

为什么下方的直线在屏幕下方,即使我已经计算过了

代码:


尝试管理您的顶部和底部区域,以便进行凹槽或底部控制:


MediaQuery是否能计算出整个屏幕,而不仅仅是小部件的大小。例如,从logicHeight中删除AppBar的大小。@Glen-有办法获得AppBar的大小吗?我还需要考虑MediaQuery中也提供的填充/视图插入)。您可以使用PreferredSize设置appBar大小。其他设置不确定。与其使用
Container>FittedBox>SizedBox>CustomPaint
不如简单地使用
Container>CustomPaint>SizedBox.expand
?只是基于我看到的谷歌视频和本文()-但我只是在学习-关键点是我意识到我不明白到底发生了什么,所以粘贴了这个问题。谢谢-但是设置我使用的逻辑高度,我需要以不同的方式动态计算?我是否需要完成MediaQuery的“大小”并减去其“填充”(我看到也有ViewInset和viewPadding?)或者是否有更好的方法动态获取实际剩余大小?LayoutBuilder!布局生成器!再也不要调用MediaQuery查询大小@RandalSchwartz——我想我的具体问题是如何计算这种情况下的正确尺寸(即这个问题)。[然而,注意,与此问题分开,向前推进时可能应使用另一种方法]也许应接受此答案,作为一般性问题的答案,重新解释为什么会发生这种情况,但不应尝试找到“修复”,因为不应尝试获取画布布局的特定屏幕或小部件大小?
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
        ),
        body: MainScreen(),
      ),
    );
  }
}

class MainScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var mq = MediaQuery.of(context);
    final logicWidth = mq.size.width;
    final logicHeight = mq.size.height;
    return 

    SizedBox.expand(
        child: Container(
            color: Colors.blueGrey,
            child: FittedBox(
                fit: BoxFit.none,   // Can more to "contain" after
                alignment: Alignment.topLeft,
                child: SizedBox(
                  width: logicWidth,
                  height: logicHeight,
                  child: CustomPaint(painter: GCPainter(),),
                ))));
  }
}

class GCPainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    var paint1 = Paint()..color = Colors.red..style = PaintingStyle.stroke..strokeWidth = 50;
    Rect rect = Rect.fromLTWH(0, 0, size.width, size.height);
    canvas.drawRect(rect, paint1);
  }

  @override
  bool shouldRepaint(GCPainter oldDelegate) => false;

  @override
  bool shouldRebuildSemantics(GCPainter oldDelegate) => false;
}
SafeArea(
 child: Container(),
 top: true,
 bottom: true,
)