Flutter笔记1

本文介绍了Flutter中的Widget概念,强调了Widget在构建UI界面中的作用,特别是无状态和有状态Widget的build方法。讲解了常用Widget如MaterialApp、Scaffold、ListView和ListTile的使用,并探讨了Dart语言特性,如final与const的区别,以及路由管理和页面切换。此外,还讨论了如何通过StatefulWidget和State进行状态管理,以及如何解耦复杂组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是Widget?

Flutter Widget是受到了react的启发,用react框架语法创建的。你可以利用Widget创建你的UI界面,Widget通过配置以及状态决定视图该如何展示出来。当状态改变的时候,Widget会借助渲染树只改变不同的地方,借此提高渲染效率。以下几类Widget是使用的比较多的:Text类,Row/Column类,Stack类,Container类。在Flutter中,将Widget视为可视组件,或与应用程序的可视方面交互的组件。

必须重写的build方法

Missing concrete implementation of StatelessWidget.build。不管是无状态的Widget还是有状态的Widget,我们在重写的时候都必须实现其build方法,要么是在createState() 中实现,要么是直接重写。

Widget-MaterialApp

一个方便的Widget,它会把许多MaterialDesign常用的Widget包裹起来,常用的属性字段有color,home,routes,theme,title。为了继承Material主题的样式,我们的应用需要从Widget-MaterialApp开始,因此我们通常会使用MaterialApp作为顶层的Widget。Material应用程序以Widget-MaterialApp开始,该Widget在应用程序的底部创建了一些有用的widget,其中包括一个Navigator,它管理由字符串标识的widget栈,即页面路由栈。Navigator可以让你的应用程序在页面之间平滑的过渡。

Widget-Scaffold

实现了基本的Material Design可视化布局结构,这个Widget提供了关于drawers,snack bars,bottom sheets的相应API,常用的属性字段有appBar,backgroundColor,body,drawer,bottomSheet,floatingActionButton。

Widget-ListView

一个可以上下滚动的线性Widget列表,ListView是最为常用的可滚动Widget。它在滚动的同时展示它的每一个子组件,在垂直于滚动方向上,子组件会充满整个ListView。

Widget-ListTile

单个固定高度的一行,通常来说,会显示一些小图标加上文字描述。

提供divideTiles函数,接收三个参数,BuildContext,Iterable<Widget>,Color,给每行之间加上一像素的边框,如果没有指定颜色,则使用context中的Theme里的ThemeData.dividerColor。

new从Dart2开始是可选的

在Dart中没有诸如public,private,protected这样的关键词,默认的都是public的,不过带下划线的类或者成员变量会被认为是私有的。

~/

Dart中返回一个整数的除法

final和const的区别

在Dart中,final和const意味着两种完全不同的东西:

1. final表示单一赋值,final变量或字段必须初始化,一旦赋值,就不能改变final变量的值。final用来修饰变量。

2. const用来修饰值,你可以在创建集合时使用它,比如const [1,2,3],也可以在使用构造函数时使用它,比如const Point(2,3)。在这里,const意味着整个对象的深度状态可以在编译时完全确定,并且对象将被冻结and完全不可变。

页面之间的切换靠路由

在Flutter中,导航器Navigator负责管理应用程序的路由栈,将路由push到导航器Navigator的栈中,将会显示更新为该路由页面,从导航器Navigator的栈中pop出路由,将显示返回到上一个路由页面。

Widget的多个子Widget

有些Widget的有些属性需要单个子Widget,而其他的某些属性,需要多个子Widget,需要一组Widget,此时用方括号表示[]。

MaterialPageRoute、CupertinoPageRoute

Navigator.push的参数为Route,一般在MaterialApp中使用MaterialPageRoute,在MaterialPageRoute中定义了Route所代表的界面的Widget信息。如果使用MaterialApp的属性routes定义了全局的路由信息,则可以使用Navigator.pushNamed函数来显示一个具体的界面。MaterialPageRoute是一个PageRoute,用来替换整个屏幕,并且带有过渡动画,builder方法必须重写。CupertinoPageRoute是一个PageRoute,用来替换整个屏幕,并且带有IOS过渡动画。

定义各种路由

在Flutter中,像对话框、菜单、Dropdown下拉选项、BottomSheet等都是通过显示一个Route实现的。在Flutter中有三种路由:PopupRoute、ModalRoute和PageRoute,使用这些路由可以实现各种弹出界面。

什么是Builder?

一个柏拉图式的Widget,用闭包来得到其子Widget。

什么是BuildContext?

一个Widget在当前的Widget树中的位置的句柄。

为什么是final?

Widget子类中的字段往往都会定义为"final"

Widget-Container

A convenience widget that combines common paintings, positioning, and sizing widgets.一个方便的Widget,结合绘制、定位和尺寸。

Widget-Row和Widget-Column

Widget中的Row是水平方向的线性布局(linear layout),children属性接收一个Widget数组,比如children:<Widget>[],这个时候可以用Widget-Expanded来填充尚未被其他子项占用的剩余可用空间,Widget-Expanded可以拥有多个children,然后使用flex参数来确定它们占用剩余空间的比例。

为什么StatefulWidget和State是两个单独的对象?

在Flutter中,这两种对象具有不同的生命周期,widget是临时的对象,用于构建当前配置和状态下的可视组件。而State对象在多次调用build之间保持不变,允许它们记住信息。在Flutter中,事件流是向上传递的,状态流是向下传递的,这类似于React中父子组件通信的方式,子widget到父widget是通过事件通信,而父widget到子widget是通过状态通信,重定向这一流程的共同父元素是State对象。

如何将带状态的复杂组件解耦?

自定义一个widget是无状态的,可以在将构造函数中将接收到的函数或者值存储在final成员变量中,然后在build函数中使用它们。责任分离允许将复杂性逻辑封装在各个widget中,同时保持父项的单纯性。

Dart中的静态构造函数(单例模式)

如果想要让类产生一个永远不会改变的对象,可以让这个对象成为编译时常量。为此,需要定义一个const构造函数,并且确保所有的成员变量都是final关键字修饰的。

Dart中的构造函数

下面是构造函数的执行顺序:

1. initializer list(初始化参数列表)

2. superclass's no-arg constructor(超类的无名构造函数super.xxx)

3. mainclass's no-arg constructor(主烤瓷的无名构造函数this.xxx)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值