php singlewidget_编码会馆-Flutter Widget框架概述

Flutter Widget采用现代响应式框架构建,这是从 React 中获得的灵感,中心思想是用widget构建你的UI。 Widget描述了他们的视图在给定其当前配置和状态时应该看起来像什么。当widget的状态发生变化时,widget会重新构建UI,Flutter会对比前后变化的不同, 以确定底层渲染树从一个状态转换到下一个状态所需的最小更改(译者语:类似于React/Vue中虚拟DOM的diff算法)。

#### Hello World

一个最简单的Flutter应用程序,只需一个widget即可!如下面示例:将一个widget传给runApp函数即可:

```dart

import 'package:flutter/material.dart';

void main() {

runApp(

new Center(

child: new Text(

'Hello, world!',

textDirection: TextDirection.ltr,

),

),

);

}

```

该runApp函数接受给定的Widget并使其成为widget树的根。 在此示例中,widget树由两个widget:Center(及其子widget)和Text组成。框架强制根widget覆盖整个屏幕,这意味着文本“Hello, world”会居中显示在屏幕上。文本显示的方向需要在Text实例中指定,当使用MaterialApp时,文本的方向将自动设定,稍后将进行演示。

在编写应用程序时,通常会创建新的widget,这些widget是无状态的StatelessWidget或者是有状态的StatefulWidget, 具体的选择取决于您的widget是否需要管理一些状态。widget的主要工作是实现一个build函数,用以构建自身。一个widget通常由一些较低级别widget组成。Flutter框架将依次构建这些widget,直到构建到最底层的子widget时,这些最低层的widget通常为RenderObject,它会计算并描述widget的几何形状。

#### 基础 Widget

Flutter有一套丰富、强大的基础widget,其中以下是很常用的:

- Text:该 widget 可让创建一个带格式的文本。

- Row、 Column: 这些具有弹性空间的布局类Widget可让您在水平(Row)和垂直(Column)方向上创建灵活的布局。其设计是基于web开发中的Flexbox布局模型。

- Stack: 取代线性布局 (译者语:和Android中的LinearLayout相似),Stack允许子 widget 堆叠, 你可以使用 Positioned 来定位他们相对于Stack的上下左右四条边的位置。Stacks是基于Web开发中的绝度定位(absolute positioning )布局模型设计的。

- Container: Container 可让您创建矩形视觉元素。container 可以装饰为一个BoxDecoration, 如 background、一个边框、或者一个阴影。 Container 也可以具有边距(margins)、填充(padding)和应用于其大小的约束(constraints)。另外, Container可以使用矩阵在三维空间中对其进行变换。

以下是一些简单的Widget,它们可以组合出其它的Widget:

```dart

import 'package:flutter/material.dart';

class MyAppBar extends StatelessWidget {

MyAppBar({this.title});

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

final Widget title;

@override

Widget build(BuildContext context) {

return new Container(

height: 56.0, // 单位是逻辑上的像素(并非真实的像素,类似于浏览器中的像素)

padding: const EdgeInsets.symmetric(horizontal: 8.0),

decoration: new BoxDecoration(color: Colors.blue[500]),

// Row 是水平方向的线性布局(linear layout)

child: new Row(

//列表项的类型是

children: [

new IconButton(

icon: new Icon(Icons.menu),

tooltip: 'Navigation menu',

onPressed: null, // null 会禁用 button

),

// Expanded expands its child to fill the available space.

new Expanded(

child: title,

),

new IconButton(

icon: new Icon(Icons.search),

tooltip: 'Search',

onPressed: null,

),

],

),

);

}

}

class MyScaffold extends StatelessWidget {

@override

Widget build(BuildContext context) {

// Material 是UI呈现的“一张纸”

return new Material(

// Column is 垂直方向的线性布局.

child: new Column(

children: [

new MyAppBar(

title: new Text(

'Example title',

style: Theme.of(context).primaryTextTheme.title,

),

),

new Expanded(

child: new Center(

child: new Text('Hello, world!'),

),

),

],

),

);

}

}

void main() {

runApp(new MaterialApp(

title: 'My app', // used by the OS task switcher

home: new MyScaffold(),

));

}

```

请确保在pubspec.yaml文件中,将flutter的值设置为:uses-material-design: true。这允许我们可以使用一组预定义Material icons。

```dart

name: my_app

flutter:

uses-material-design: true

```

为了继承主题数据,widget需要位于MaterialApp内才能正常显示, 因此我们使用MaterialApp来运行该应用。

在MyAppBar中创建一个Container,高度为56像素(像素单位独立于设备,为逻辑像素),其左侧和右侧均有8像素的填充。在容器内部, MyAppBar使用Row 布局来排列其子项。 中间的title widget被标记为Expanded, ,这意味着它会填充尚未被其他子项占用的的剩余可用空间。Expanded可以拥有多个children, 然后使用flex参数来确定他们占用剩余空间的比例。

MyScaffold 通过一个Column widget,在垂直方向排列其子项。在Column的顶部,放置了一个MyAppBar实例,将一个Text widget作为其标题传递给应用程序栏。将widget作为参数传递给其他widget是一种强大的技术,可以让您创建各种复杂的widget。最后,MyScaffold使用了一个Expanded来填充剩余的空间,正中间包含一条message。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值