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

  • 相关阅读:
    tomcat feign rocketmq 最大线程数
    rocketmq
    使用docker在linux上安装oracle数据库
    dnf 腾讯 解人脸
    记一次mysql慢查询优化
    python运行内存分析
    【转】【WPF】WPF强制刷新界面
    【转】【WPF】Grid显示边框线
    流媒体服务新手入门教程03--音视频基础
    流媒体服务新手入门教程02--m7s环境搭建
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/14875166.html
Copyright © 2020-2023  润新知