Flutter学习笔记(一)

Flutter Widget参考React,采用现代响应式框架构建,中心思想是用widget构建你的UI。Widget描述了他们的视图在给定七当前配置和状态时应该开起来像什么。当widget的状态发生变化时,widget会重新构建UI,Flutter会对比前后变化的不同,以确定底层渲染树从一个状态转换到下一个状态所需的最小更改。

Hello World

从一个最简单的Flutter应用程序Hello World分析,如下面示例代码:

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: 取代线性布局,stack允许子widget堆叠,你可以使用Positioned来定位他们相对于Stack的上下左右四条边的位置。Stacks是基于Web开发中的绝度定位布局模型设计的。
  • Container: Container可让您创建矩形视觉元素。container可以装饰为一个BoxDecoration,如background、一个边框、或者一个阴影。Container也可以具有边距、填充和应用于其大小的约束。另外Container可以使用矩阵在三维空间中对其进行变化。

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

import 'package:flutter/material.dart';

void main() {
  runApp(
    new Center(
      child: MyScanffold()
    )
  );
}

class MyScanffold extends StatelessWidget {
  const MyScanffold({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Material(
      child: Column(
        children: [
          MyAppBar(),
          Expanded(
              child: Center(
                child: Text("Hello, world"),
              )
          )
        ],
      ),
    );
  }
}

class MyAppBar extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 56.0, // 单位是逻辑上的像素(并非真实的像素,类似于浏览器中的像素)
      padding: const EdgeInsets.symmetric(horizontal: 8.0),
      decoration: BoxDecoration(color: Colors.blue[500]),
      child: Row(
        children: [
          IconButton(
              onPressed: null,
              icon: Icon(Icons.menu),
              tooltip: "Navigation menu",
          ),
          Expanded(child: Text(
            "Example title",
            style: Theme.of(context).primaryTextTheme.title,
          ),),
          IconButton(
              onPressed: null,
              icon: Icon(Icons.search),
              tooltip: "Search",
          )
        ],
      ),
    );
  }
}

 

在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。

posted @ 2021-06-11 15:09  木子沉雨  阅读(58)  评论(0编辑  收藏  举报