当前位置: 首页 > 知识库问答 >
问题:

前端 - flutter页面布局问题?

丁毅庵
2023-08-01

页面布局代码如下,第一次打开页面Column里三个组件是紧挨着的,零点几秒后才MainAxisAlignment.spaceBetween分开,时间虽然不是很久但是肉眼还是可见的有点延迟,请问是因为什么原因?

    Scaffold(          body: WillPopScope(            onWillPop: () async {              return false;            },            child:         Container(            margin: EdgeInsets.fromLTRB(0, 124, 0, 64),            child:Column(              mainAxisAlignment: MainAxisAlignment.spaceBetween,              children: [                Container(                child:Text('111')),                Container(//几百px的图片                  child: Image.asset('images/xxx.png'),                ),                Container(                child:Text('222')),              ],            )        )    )

共有1个答案

弘思聪
2023-08-01

在 Flutter 中,页面布局的渲染是异步的,因此你在第一次打开页面时,可能会出现布局初始状态是紧挨着的,然后经过零点几秒后才按照 MainAxisAlignment.spaceBetween 分开的情况。这是因为 Flutter 在初始化时会进行布局计算和渲染,但这些过程并不是立即完成的,可能会需要一些时间。所以,你看到的延迟是因为布局的计算和渲染过程。

为了解决这个问题,你可以尝试使用 WidgetsBinding 组件的 addPostFrameCallback 方法,该方法在 widget 首次渲染完成后会执行传入的回调函数。这样你可以在回调函数中触发重新绘制页面,确保布局在页面加载完成后立即按照 MainAxisAlignment.spaceBetween 进行分开。

示例代码如下:

dart
Copy code
import 'package:flutter/material.dart';

class MyPage extends StatefulWidget {
@override
_MyPageState createState() => _MyPageState();
}

class _MyPageState extends State<MyPage> {
bool _isLayoutReady = false;

@override
Widget build(BuildContext context) {

return Scaffold(  body: WillPopScope(    onWillPop: () async {      return false;    },    child: Container(      margin: EdgeInsets.fromLTRB(0, 124, 0, 64),      child: Column(        mainAxisAlignment: MainAxisAlignment.spaceBetween,        children: [          Container(            child: Text('111'),          ),          Container(            // 几百px的图片            child: Image.asset('images/xxx.png'),          ),          Container(            child: Text('222'),          ),        ],      ),    ),  ),);

}

@override
void initState() {

super.initState();WidgetsBinding.instance.addPostFrameCallback((_) {  setState(() {    _isLayoutReady = true;  });});

}
}
在这个示例中,我们使用了一个布尔变量 _isLayoutReady 来标记页面是否已经渲染完成。在 initState 方法中,我们使用 WidgetsBinding 组件的 addPostFrameCallback 方法来添加一个回调函数,该回调函数会在 widget 首次渲染完成后执行。在回调函数中,我们调用了 setState 方法来触发重新绘制页面,确保布局按照 MainAxisAlignment.spaceBetween 分开。

这样做的话,即使页面初始化时出现布局紧挨着的情况,页面加载完成后会立即进行重新布局,避免了延迟问题。

 类似资料:
  • 页面由组件构成,页面的高度和宽度由组件的高度和宽度确定,当页面的高度大于屏幕的高度,或者页面的宽度大于屏幕的宽度,页面就会出现滚动条。 页面指的是w文件 屏幕指的是门户中用于显示功能界面的区域 目录 1、流式布局 2、充满布局 2.1、左右充满 2.2、上下充满 2.3、多标签页充满 3、响应式布局 4、手机界面布局 4.1、显示多页 4.2、显示多行信息(一行显示一条记录) 4.3、显示多行信息

  • 页面由组件构成,页面的高度和宽度由组件的高度和宽度确定,当页面的高度大于屏幕的高度,或者页面的宽度大于屏幕的宽度,页面就会出现滚动条。 页面指的是w文件 屏幕指的是门户中用于显示功能界面的区域 目录 1、流式布局 2、充满布局 2.1、左右充满 2.2、上下充满 2.3、多标签页充满 3、响应式布局 4、手机界面布局 4.1、显示多页 4.2、显示多行信息(一行显示一条记录) 4.3、显示多行信息

  • 本文向大家介绍asp.net基础学习之前端页面布局,包括了asp.net基础学习之前端页面布局的使用技巧和注意事项,需要的朋友参考一下 前端就是给人看的界面,后台人员不仅要知道后台代码的编写,更要知道前端的布局。有时候要比前端人员知道的还要多,因为有可能前端人员是个21天精通ps的大师级人物。这时候你可以自己写前端。 1.CSS  •CSS(Cascading Style Sheet),中文译为层

  • flutter 状态栏问题 当我设置0的时候 floatingActionButton 显示正常 当我设置一点高度为什么会这样? 这是什么原因导致的? 希望知道原因 我想 floatingActionButton 可以在Appbar下边

  • 前端面试(前言) 面试基础 页面布局 CSS盒模型:是CSS的基石。 DOM事件 HTTP协议 面向对象 原型链:能说出原型链的始末 面试进阶 通信:普通的通信、跨域通信 安全:CSRF、XSS。 算法 回答问题时要注意的 (1)题干的要求真的是字面要求的这么简单吗? (2)答案怎么写,技巧在哪里 (3)如果想证明我的实力,应该有几种答案? 本文来讲一下页面布局。 题目:页面布局 问题:假设高度默

  • 大佬们,用x6如何实现这种布局. 目前使用的是 dagre layout 左右布局。好像无法满足组内的上下布局。