StatelessWidget和 StatefulWidget是 flutter的基础组件,日常开发中自定义 Widget都是选择继承这两者之一。也是在往后的开放中,我们最多接触的Widget:
StatelessWidget:无状态的,展示信息,面向那些始终不变的UI控件;
StatefulWidget:有状态的,可以通过改变状态使得 UI 发生变化,可以包含用户交互(比如弹出一个 dialog)。
在实际使用中,Stateless与Stateful的选择需要取决于这个 Widget 是有状态还是无状态,简单来说看界面是否需要更新。
StatelessWidget
StatelessWidget用于不需要维护状态的场景,它通常在 build方法中通过嵌套其它Widget来构建UI,在构建过程中会递归的构建其嵌套的Widget。
BuildContext表示构建widget的上下文,它是操作widget在树中位置的一个句柄,它包含了一些查找、遍历当前Widget树的一些方法。每一个widget都有一个自己的context对象。
import ‘package:flutter/material.dart’;
void main ()=> runApp (StatelessApp());
class StatelessApp extends StatelessWidget {
//在build方法中通过嵌套其它Widget来构建UI,在构建过程中会递归的构建其嵌套的Widget
@override
Widget build(BuildContext context) {
//嵌套 MaterialApp:封装了应用程序实现Material Design所需要的一些widget
return MaterialApp(
title: “Widget演示”,
//标题,显示在recent时候的标题
//主页面
//Scaffold : Material Design布局结构的基本实现。
home: Scaffold(
//ToolBar/ActionBar
appBar:AppBar(title: Text(“Widget”)),
body: Text(“Hello,Flutter!”),
)
);
}
}
Material Design:
一种设计语言,Material Design 于2014年的 Google I/O
首次亮相,是谷歌推出的全新的设计语言。说白了,就是一种设计风格。
StatefulWidget
StatefulWidget是动态的,添加了一个新的接口 createState()用于创建和Stateful widget相关的状态 State,它在Stateful widget的生命周期中可能会被多次调用。
当State被改变时,可以手动调用其 setState()方法通知Flutter framework状态发生改变,Flutter framework在收到消息后,会重新调用其 build方法重新构建widget树,从而达到更新UI的目的。
class StatefulState extends State
{
int _i;
///当Widget第一次插入到Widget树时会被调用,对于每一个State对象,Flutter framework只会调用一次该回调
@override
void initState() {
super.initState();
_i= 1;
}
@override
Widget build (BuildContext context) {
return MaterialApp (
title: “Widget演示”,
theme: ThemeData(),
home:Scaffold (
appBar: AppBar (title: Text(“Widget”)),
body: RaisedButton (
onPressed: () {
//修改状态,setState会重新调用build更新ui
setState(() {_i++;});
},
child: Text(“Hello,Flutter! $_i”),
),
));
}
}
State生命周期
State的生命周期为:
State类除了 build之外还提供了很多方法能够让我们重写,这些方法会在不同的状态下由Flutter调起执行,所以这些方法我们就称之为生命周期方法。在这里我们用statefulwidget点击按钮后移除子statefulwidget。
import ‘package:flutter/material.dart’;
void main () => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State {
bool isShowChild;
///当Widget第一次插入到Widget树时会被调用,对于每一个State对象,Flutter framework只会调用一次该回调
@override
void initState() {
super.initState();
isShowChild = true;
debugPrint(“parent initState…”);
}
///初始化时,在initState()之后立刻调用
///当依赖的InheritedWidget rebuild,会触发此接口被调用
@override
void didChangeDependencies() {
super.didChangeDependencies(