Flutter 里面到处都是小部件(Widget),你要显示一行文字,用一个 Text 小部件。需要展示图像,需要用到 Image 小部件。需要一个能设置背景、尺寸、边距的容器,可以使用 Container 小部件。要添加一组并排显示的内容,要用的是 Row 小部件。需要一组竖排显示的内容,可以使用 Column 小部件。
小部件可以组合到一块儿用,一个小部件是可以是另一个小部件或者另一些小部件的爸爸,另一个小部件又可以有它自己的孩子或孩子们。有些小部件只能有一个孩子(child),比如 Container。还有些小部件可以有多个孩子(children),比如 Row 或者 Column。
不同类型的小部件都有各自的功能,它们里面都定义了一些属性还有方法,通过这些东西我们可以配置使用小部件。比如 Container 部件里可以使用 width 设置容器的宽度,或者使用 height 属性设置容器的高度,在它的 child 属性里面需要指定这个 Container 的孩子是谁。注意部件属性的值很多都是 double 类型的,比如你需要一个 100 宽的容器,这个 Container 的 width 应该设置成 80.0,而不是整数 80。
我们可以自由地创建自己需要的小部件,在这个自定义的小部件里面,你可以使用 Flutter 提供的现成的小部件,也可以使用你定义的其它的自定义的小部件。一个自定义的小部件就是一个 Class(类),一般这个类会继承 StatelessWidget 或者 StatefulWidget ,这里说的 State 指的就是数据。如果在你的小部件里需要处理修改 State,那你需要创建一个 StatefulWidget 。如果不需要处理修改 State,可以创建一个 StatelessWidget。
下面创建了一个叫 App 的小部件,它继承了 StatelessWidget,意思就是在这个小部件里面不需要修改数据:
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return null;
}
}StatelessWidget 是个抽象类,它需要让我们在类里面添加一个叫 build 的方法,这个方法返回的东西就是一个 Widget,也就是你的自定义的小部件。
之前我们直接在 runApp 里面用了一个 Center 小部件(在界面上显示 hello),现在可以把这个 Center 放在自定义的 App 小部件里面,让它作为 build 方法返回的东西,然后把 App 交给 runApp。像这样:
import 'package:flutter/material.dart';
void main() {
runApp(App());
}
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Text(
'hello',
textDirection: TextDirection.ltr,
style: TextStyle(
fontSize: 32.0,
color: Colors.yellow,
),
),
);
}
}
热加载
现在我们的应用就可以使用热加载功能了,试着修改一下 Text 小部件里的文件,保存文件以后,在模拟器上你会立即看到修改之后的效果。
组合使用自定义小部件
现在我们创建了一个叫 App 的 Stateless 类型的小部件,它的 build 方法 return 的东西会在屏幕中间显示一个 hello。下面我们可以单独再创建一个叫 Hello 的小部件,然后可以让它作为 App 小部件的 build 方法 return 的东西。小部件可以单独放在一个文件里面,然后在想要使用这个小部件的地方,先导入它,就可以使用这个小部件了。
我们在 lib 下面新建一个 demo 目录,里面创建一个文件叫 hello_demo.dart,文件里面可以定义一个叫 Hello 的小部件,注意文件顶部先要导入 flutter 这个 package 里的 material。
lib/demo/hello_demo.dart
import 'package:flutter/material.dart';
class Hello extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Text(
'hello',
textDirection: TextDirection.ltr,
style: TextStyle(
fontSize: 32.0,
color: Colors.yellow,
),
),
);
}
}lib/main.dart
import './demo/hello_demo.dart';
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Hello();
}
}我们在 App 这个小部件里面组合使用了另一个自己定义的小部件 Hello,因为这个小部件是在一个单独的文件里定义的,所以使用它的时候需要先导入定义这个小部件的那个文件(hello_demo.dart)。




评论
想问一下皓哥这个动图是用什么软件做的:)
7 年 2 个月 以前
用的还是录视频的软件,Screenflow。
7 年 2 个月 以前