Flutter 开发学习笔记(4):widget布局容器学习

文章目录

  • 前言
  • 相关链接
  • Widget 有状态和无状态
  • Flutter 代码风格
    • 去掉烦人的括号后缀提示
    • 代码缩进
  • Flutter 布局
    • 最简单的布局
    • widgets和Material widgets
  • Dark语法习惯
  • Flutter 布局
    • 默认布局
    • Center居中
    • Padding 填充
    • Align对齐
      • 默认居中
      • 顶部
      • 底部
      • 右上角
  • 通用 Widget
    • Container
      • 处于性能原因,最好不要使用Container
      • 一个简单的Container
    • GridView
      • GridView.extent
      • GridView.count
    • 剩下的容器,不再展开
  • 总结

前言

再学习一个框架中,布局容器的学习是最重要的。在Html中,通过css来调整布局,在WPF中,用Grid/StackPanel/UniGrid/DockPanel等容器来嵌套布局。我其实更喜欢WPF这种方式,因为我们一般也只采用一个布局方式,多种布局方式不并存,而且布局容器只管理布局,这样更容易做业务的解耦

相关链接

Flutter 官网中文网址

给 Web 开发者的 Flutter 指南

Widget 有状态和无状态

在这里插入图片描述

其实我感觉这个说明不太接地气,应该是静态Widget和动态Widget。静态Widget是不能直接修改的,必须要用重新刷新更新。动态Widget是在内存里面专门划出一个空间,数据驱动修改视图。一般来说,能用静态就不用动态,动态是有实际的数据变更需求才进行声明的。

而Flutter中一切皆Widget的概念,类似于一切皆Box或者Div的概念。

Flutter 代码风格

去掉烦人的括号后缀提示

在这里插入图片描述

在这里插入图片描述

代码缩进

Flutter中的代码缩进竟然是靠【,】逗号来进行的,我都惊呆了。
在这里插入图片描述

在这里插入图片描述

Flutter 布局

Flutter 中的布局

最简单的布局

我们将main.dart改为此布局

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});// This widget is the root of your application.@overrideWidget build(BuildContext context) {const String appTitle = 'Flutter layout demo';return MaterialApp(title: appTitle,home: Scaffold(appBar: AppBar(title: const Text(appTitle),),body: const Center(child: Text('Hello World'),),),);}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

widgets和Material widgets

Material是谷歌旗下的UI框架,Material widgets是谷歌官方对widgets的封装。我们的示例代码用的就是Material widgets的布局。Flutter 项目默认使用。
在这里插入图片描述

在这里插入图片描述

Material App是flutter推荐的默认移动端应用布局,包含多种功能。我们作为初学者,还是以Widget原生学习为主。先学简单的UI布局。

Dark语法习惯

我非常讨厌官方这种无线套娃的嵌套地狱写法,函数的入口就是return了。我一般都喜欢拼装式的写法,就是先声明返回的内容,然后再一点一点拼起来

在这里插入图片描述
在这里插入图片描述

Flutter 布局

Flutter:Center(居中布局),Padding(填充布局),Align(对齐布局)

Flutter有三大布局,对齐,居中,填充。简单来说
对齐:相对布局,可控性最强
居中:强制水平和垂直居中
填充:居中+动态长宽,配合padding使用在控制长宽

默认布局

import 'package:flutter/material.dart';
import 'package:flutter_widget_test/pages/ChartTestPage.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'utils/ToastUtils.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});// This widget is the root of your application.@overrideWidget build(BuildContext context) {const String appTitle = 'Flutter layout demo';const textStyle = TextStyle(fontSize: 50);var res = MaterialApp(title: appTitle,home: Scaffold(appBar: AppBar(title: const Text(appTitle),),body: const Text('hello flutter',style: textStyle,),));return res;}
}

在这里插入图片描述

默认形状
在这里插入图片描述

Center居中

body: const Center(child: Text('hello flutter',style: textStyle,),
),

在这里插入图片描述

Padding 填充

 body: const Padding(padding: EdgeInsets.all(100),child: Text('hello flutter',style: textStyle,),),

在这里插入图片描述

Align对齐

默认居中

在这里插入图片描述

body: const Align(child: Text('hello flutter',style: textStyle,),
),

在这里插入图片描述

顶部

body: const Align(alignment: Alignment.topCenter,child: Text('hello flutter',style: textStyle,),
),

在这里插入图片描述

底部

          body: const Align(alignment: Alignment.bottomCenter,child: Text('hello flutter',style: textStyle,),),

在这里插入图片描述

右上角

          body: const Align(alignment: Alignment.topRight,child: Text('hello flutter',style: textStyle,),),

在这里插入图片描述

通用 Widget

在这里插入图片描述
我们也要熟练掌握Android Studio的常用操作。

在这里插入图片描述

Container

如果说Widget是没有css的div的话,Container就是有Css的div

处于性能原因,最好不要使用Container

avoid_unnecessary_containers

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

一个简单的Container

body: Container(decoration: BoxDecoration(border: Border.all(width: 10, color: Colors.black38),),alignment: Alignment.center,child: const Text('hello flutter',style: textStyle,),
),

在这里插入图片描述

GridView

GridView.extent

通过限制单元格最大宽度来生成表格

class MyApp extends StatelessWidget {const MyApp({super.key});// This widget is the root of your application.@overrideWidget build(BuildContext context) {const String appTitle = 'Flutter layout demo';const textStyle = TextStyle(fontSize: 25);//list构造器List<Text> _buildTextList(int count) => List.generate(count,(index) => Text('List${index}',style: textStyle,));var body = GridView.extent(maxCrossAxisExtent: 100,padding: const EdgeInsets.all(4),children: _buildTextList(30),);var res = MaterialApp(title: appTitle,home: Scaffold(appBar: AppBar(title: const Text(appTitle),),body: body,));return res;}
}

在这里插入图片描述

GridView.count

通过设置每行列数来实现布局,自动换行,竖向过长可以自动滚动

class MyApp extends StatelessWidget {const MyApp({super.key});// This widget is the root of your application.@overrideWidget build(BuildContext context) {const String appTitle = 'Flutter layout demo';const textStyle = TextStyle(fontSize: 25);//list构造器List<Text> _buildTextList(int count) => List.generate(count,(index) => Text('List${index}',style: textStyle,),);return MaterialApp(title: appTitle,home: Scaffold(appBar: AppBar(title: const Text(appTitle),),body: GridView.count(crossAxisCount: 4,children: _buildTextList(30),),),);}
}

剩下的容器,不再展开

Flutter还有很多官方的容器,这里就不作展开了,大家可以去看一下。基本都有特殊场景的专门封装。

Flutter 容器构建

在这里插入图片描述

总结

Flutter还是挺好用的,用下来的体验感觉还行。至少没啥Bug。问题就两个:
一个是Dark语法的无限嵌套地狱有点过于蛋疼,要及时解耦。因为他把Html的工作放在了Dark里面。和xaml的设计完全不一样,xaml的设计是把简单的代码工作放在xaml里面,复杂的逻辑在viewModel里面写。而前端是,html声明静态元素,css声明样式,js去再去获取dom元素。感觉xaml的语法设计还是领先业界的,可惜只有avalonia继承了下来。

另一个问题就是蛋疼的格式化风格,缩进是两格,没法改。展不展开代码看加不加逗号,有点蛋疼。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/788591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S Pod 的生命周期

本文会介绍 1个 POD 从启动到被关闭删除&#xff0c; 有什么事情发生&#xff0c; 和有什么组件被参与进来 容器环境初始化阶段 apiserver 接受到创建容器的指令时&#xff0c; 在构建容器之前会有一些环境的设置阶段&#xff0c; 例如node 选择&#xff0c; image 镜像下载等…

路由和远程访问是什么?

路由和远程访问在现代互联网时代中&#xff0c;扮演着至关重要的角色。它们为我们提供了便捷的信息传递途径&#xff0c;让不同地区的电脑、设备以及人们之间能够轻松进行通信和交流。 对于路由来说&#xff0c;它是连接互联网上的各个网络的核心设备。一台路由器可以将来自不同…

【Qt】使用Qt实现Web服务器(九):EventSource+JSON实现工业界面数据刷新

1、效果 效果如下,实时刷新温度、湿度 2、源码 2.1 index.html <html><body> <!-- 页面布局,本人对HTML标签不熟悉,凑合看吧 --> <div><label for

前后端开发之——文章分类管理

原文地址&#xff1a;前后端开发之——文章分类管理 - Pleasure的博客 下面是正文内容&#xff1a; 前言 上回书说到 文章管理系统之添加文章分类。就是通过点击“新建文章分类”按钮从而在服务端数据库中增加一个文章分类。 对于文章分类这个对象&#xff0c;增删改查属于配…

PyQt ui2py 使用PowerShell将ui文件转为py文件并且将导入模块PyQt或PySide转换为qtpy模块开箱即用

前言 由于需要使用不同的qt环境&#xff08;PySide&#xff0c;PyQt&#xff09;所以写了这个脚本&#xff0c;使用找到的随便一个uic命令去转换ui文件&#xff0c;然后将导入模块换成qtpy这个通用库(支持pyside2-6&#xff0c;pyqt5-6)&#xff0c;老版本的是Qt.py(支持pysid…

Appium无线自动化实用教程

文章目录 简介核心特点工作原理使用Appium进行自动化测试的一般步骤 环境设置安装和启动Appium Server使用Node.js和npm安装Appium Server&#xff1a;启动Appium Server:命令行启动使用Appium Desktop安装和启动Appium Server&#xff1a;使用代码启动appium server 编写测试代…

Linux|centos7|postgresql数据库主从复制之异步还是同步的问题

前言&#xff1a; postgresql数据库是一个比较先进的中型关系型数据库&#xff0c;原本以为repmgr和基于repmgr的主从复制是挺简单的一个事情&#xff0c;但现实很快就给我教育了&#xff0c;原来postgresql和MySQL一样的&#xff0c;也是有异步或者同步的复制区别的 Postgre…

vivado 面向 7 系列器件的 AES 密钥编程

要将 AES 密钥编程到 BBR 中 &#xff0c; 请在“硬件 (Hardware) ”窗口中右键单击 FPGA 器件并选中“ Program BBR Key ”。 在“ BBR 密钥编程 (Program BBR Key) ”对话框中 &#xff0c; 输入文件名或者浏览至目标文件以指定 AES 密钥文件 ( .nky ) 。指 定有效的 .n…

4.2学习总结

解题思路 遍历初始整数的全排列,然后计算每一个排列与原排列的的步数找到花费的最小值就行了 代码 #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <…

Qt 使用QPropertyAnimation动画效果的图片浏览器

文章目录 效果图功能点代码解析图片切换显示与动画效果图片缩放 总结 效果图 功能点 加载指定路径下的所有图片并显示滑动滑动条查看指定图片&#xff0c;也滚轮切换图片滑动条缩略图加入动画效果图片可以进行缩放移动查看 代码解析 整体来说相对&#xff0c;显示图片的是一…

Apache Paimon实时数据糊介绍

Apache Paimon 是一种湖格式,可以使用 Flink 和 Spark 构建实时 数据糊 架构,用于流式和批处理操作。Paimon 创新地将湖格式和 LSM(日志结构合并树)结构相结合,将实时流式更新引入湖架构中。 Paimon 提供以下核心功能: 实时更新: 主键表支持大规模更新的写入,具有非常…

LeetCode 热题 100 | 动态规划(一)

目录 1 70. 爬楼梯 1.1 基本思路 1.2 官方题解 2 118. 杨辉三角 3 198. 打家劫舍 菜鸟做题&#xff0c;语言是 C 1 70. 爬楼梯 核心思想&#xff1a;把总问题拆解为若干子问题。 总问题&#xff1a;上到 5 楼的方式有多少种子问题&#xff1a;上到 4 楼的方式有多…

Oracle常用sql命令(新手)

1、备份单张表 创建复制表结构 create table employeesbak as select * from cims.employees 如果只复制表结构&#xff0c;只需要在结尾加上 where 10 插入数据 insert into employeesbak select * from cims.employees 删除一条数据 delete from…

【Servlet】服务器内部转发以及客户端重定向

文章目录 一、服务器内部转发&#xff1a;request.getRequestDispatcher("...").forward(request, response);二、客户端重定向&#xff1a;response.sendRedirect("");三、服务器内部转发代码示例四、客户端重定向代码示例 一、服务器内部转发&#xff1a…

小象超市(原美团买菜) 的大屏图表

文章目录 概要技术细节技术名词解释小结 概要 20203年12月1日&#xff0c;美团旗下自营零售品牌“美团买菜”升级为全新品牌“小象超市”。 &#xff0c;“小象超市”坚持美团自营零售模式&#xff0c;通过在社区设立的集存储、分拣、配送为一体的便民服务站&#xff0c;为社区…

go之web框架gin

介绍 Gin 是一个用 Go (Golang) 编写的 Web 框架。 它具有类似 martini 的 API&#xff0c;性能要好得多&#xff0c;多亏了 httprouter&#xff0c;速度提高了 40 倍。 如果您需要性能和良好的生产力&#xff0c;您一定会喜欢 Gin。 安装 go get -u github.com/gin-gonic/g…

【测试篇】接口测试

接口测试&#xff0c;可以用可视化工具 postman。 如何做接口测试&#xff1f;&#xff1f; 我们可以先在浏览器中随机进入一个网页&#xff0c;打开开发者工具&#xff08;F12&#xff09;。 随便找一个接口Copy–>Copy as cURL(bash) 打开postman 复制地址 进行发送。 …

R统计实战:详解机器学习Adaboost的操作步骤与应用

一、引言 机器学习是人工智能的核心领域之一&#xff0c;其重要性体现在其能够从数据中自动学习并改进的能力上。在实际问题中&#xff0c;机器学习已经被广泛应用于各个领域&#xff0c;包括但不限于金融、医疗、电子商务、社交网络等。例如&#xff0c;在金融领域&#xff0c…

Java SpringBoot中优雅地判断一个对象是否为空

在Java中&#xff0c;可以使用以下方法优雅地判断一个对象是否为空&#xff1a; 使用Objects.isNull()方法判断对象是否为空&#xff1a; import java.util.Objects;if (Objects.isNull(obj)) {// obj为空的处理逻辑 }使用Optional类优雅地处理可能为空的对象&#xff1a; impo…

Node.js知识点总结:从入门到入土

Node.js知识点总结&#xff1a;从入门到入土 node.js概念说明与相关知识储备了解基本概念&#xff1a;JavaScript基础能力&#xff1a;安装和设置Node.js环境&#xff1a;核心能力模块&#xff1a;重点能力-异步编程&#xff1a;使用npm管理依赖&#xff1a;构建Web应用&#x…