第一个Flutter应用

今天,我们就来一起阅读一下Flutter项目初始化后的代码!

创建应用

  • 通过AS创建一个新的Flutter工程,我们会得到一个默认的计数器应用示例

  • 项目的dart代码主要在lib/main.dart

class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',theme: ThemeData(primarySwatch: Colors.blue,),home: MyHomePage(title: 'Flutter Demo Home Page'),);}
}class MyHomePage extends StatefulWidget {MyHomePage({Key? key, required this.title}) : super(key: key);final String title;@override_MyHomePageState createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {int _counter = 0;void _incrementCounter() {setState(() {_counter++;});}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(widget.title),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text('You have pushed the button this many times:'),Text('$_counter',style: Theme.of(context).textTheme.headline4,),],),),floatingActionButton: FloatingActionButton(onPressed: _incrementCounter,tooltip: 'Increment',child: Icon(Icons.add),), // This trailing comma makes auto-formatting nicer for build methods.);}
}

代码分析

1.导入包

import 'package:flutter/material.dart';

后面使用的一些widget就是从这里来的,所以可以理解为一个UI 组件库

2.应用入口

void main() => runApp(MyApp());
  • 与大多数语言是一样的,Flutter或者说dartmain函数为应用程序的入口的。main函数中调用的runApp方法,它的功能是启动Flutter应用。runApp它接受一个Widget参数

  • 怎么去理解这个Widget参数呢?

    • 就当它是一个组件的别称就好了

    • 或者说对于这个入口,是和App.jsxApp.vue很类似的一个东西

  • main函数使用了js中的匿名函数写法,这种简写比较潇洒

3.应用结构

class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(//应用名称  title: 'Flutter Demo', theme: ThemeData(//蓝色主题  primarySwatch: Colors.blue,),//应用首页路由  home: MyHomePage(title: 'Flutter Demo Home Page'),);}
}
  • MyApp类代表Flutter应用,它继承了StatelessWidget类,那么,它作为子类就是一个StatelessWidget类呗

    • 那么简单来说,所有的Widget都分为两类

      • StatelessWidget

      • StatefulWidget

    • 其实就是React中的受控组件和非受控组件

      • 一下就通透了是不
    • 那么,如果类比Vue

      • 对于Vue2

        • 传入props来控制就是受控了

        • 内部的数据有变化都可以理解为受控,并不需要像ReactsetState或者调用useStata去更新

      • 对于Vue3

        • 内部数据使用refreactive包裹的是受控组件
  • Flutter中,几乎都是widget,包括一些css的样式都是以widget的形式提供的

    • 感觉样式写起来没有纯css快啊

    • 但是仔细一想,这样代码读起来对新手比较友好了

    • 对新手来说,Flutter的样式控制应该更加容易理解

  • Flutter在构建页面时,会调用组件的build方法,widget的主要工作是提供一个build()方法

    • 这个方法就是如何构建这个widge组件
  • MaterialAppMaterial库中提供的一个常用的基础的Widget,通过它可以设置应用的名称,主题,语言,首页及路由列表等。

  • home是应用的首页,它也是一个什么啊?

    • widget

首页

1.初识Widget

class MyHomePage extends StatefulWidget {MyHomePage({Key? key, required this.title}) : super(key: key);final String title;@override_MyHomePageState createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {...
}
  • 接着上面继续看,我们App的首页home的这个widget也就是MyHomePage它是一个受控组件!

  • 下面细说一下两者

    • 1.受控,非受控,有状态,无状态就不多说了,简单来说就是是否是响应式的,能不能变化

    • 2.重点:Stateful widget至少由两个类组成:

      • StatefulWidget

      • State类,StateWidget类本身是不变的,但是State类中持有的状态在widget生命周期中可能会发生变化

2._MyHomePageState类是MyHomePage类对应的状态类。

  • 比较奇怪的一点

    • MyHomePage类中没有build方法,这个前面说的每个widget都有一个build方法好像不同

    • 这个方法被移动到了\_MyHomePageState方法中

    • 下面就让我们看看状态类吧

3.State类

a._MyHomePageState类解析

下面,我们来康康这个类里面包含了那些东西吧!

  • 组件的状态

比如这个初始化项目是一个计数器,所以状态就是一个count

int _counter = 0; //用于记录按钮点击的总次数
  • 设置状态的自增函数
void _incrementCounter() {setState(() {_counter++;});
}

当按钮点击,就调用这个函数,改变状态会使用setState方法,这个和React的类组件汇总改变状态的方式很像

  • 听说Flutter对这个方法做了优化,不需要去修改每个widget,源码还没有了解过

  • 构建UI界面的build方法

    • MyHomePage第一次创建时,\_MyHomePageState类也会被创建,当初始化完成后,Flutter框架会调用widgetbuild方法来构建widget

      • 这个和cssdom树,渲染树一个道理吧
Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(widget.title),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text('You have pushed the button this many times:'),Text('$_counter',style: Theme.of(context).textTheme.headline4,),],),),floatingActionButton: FloatingActionButton(onPressed: _incrementCounter,tooltip: 'Increment',child: Icon(Icons.add),), );
}
  • ScaffoldMaterial库中提供的页面脚手架,它提供了默认的导航栏,标题和包含主屏幕widget树body属性。路由默认都是通过Scaffold创建

  • body的组件树

    • 其中包含了一个Center组件,它可以将子组件移动到屏幕中心

      • 真的就是css语义化了
    • Center自组件是一个Column组件,它可以将所有自组件沿屏幕垂直方向依次排列

      • 子组件a.Text,显示固定文本

      • 子组件b.Text,显示\_counter状态的数值

  • floatingActionButton是页面右下角的带+的按钮,它的onPressed属性接受一个回调函数,就是onClick,呵呵

  • 所以逻辑是这样

    • 点击按钮,调用自增函数

    • setState引起页面变化rebuild达到有状态!!!

b.为啥build方法放在State中呢?

  • 分而治之,state自治提高效率

    • 状态访问方便

    • 如果放在StatefulWidget,那需要把state传进入,就变得麻烦了

      • 或者把state状态公开,但是这样就很danger
  • 轻轻地来,轻轻地走

    • 如果build放在里面,会给继承带来麻烦

      • 会出现多个build

      • 一山不容二虎啊,会打架

小荷才露尖尖角,和Flutter应用说你好相关推荐

  1. 元宇宙,小荷才露尖尖角

    从闻所未闻到骤然爆火,脱胎于科幻小说的元宇宙,在过去的一年时间里迎来了集中爆发.尽管各路玩家对元宇宙进行了诸多着墨,但时至今日其从概念向实处进发仍然存在现实差距. 放眼行业,虽然元宇宙游戏.直播.社交 ...

  2. 数睿数据2022新年致辞:小荷才露尖尖角,早有蜻蜓立上头

    2021年是经营丰收的一年,在外部经济下行的大环境下,公司经受住了严峻的考验,秉持为客户.社会创造价值的理念,千方百计提升经营质量和组织运作效率.在全体数睿数据员工的共同努力下,公司经营业绩取得了历史 ...

  3. c语言传球游戏,传球游戏_小荷才露尖尖角19792014_新浪博客

    传球游戏 邓丞希 东方小学三年级 今天下午,我在赏识作文班上玩了一个有趣的传球游戏. 老师把我们分成两个组,每组三双筷子和一个乒乓球. 游戏开始了.首先,我们组的第一个同学用筷子夹起了乒乓球,准备传给 ...

  4. 小荷才露尖尖角之struts的秘密

    我们都知道SSH是目前比较流行的一个Web应用程序开源框架,而struts又是之中的领头框架,究竟它有怎样的力量竟然可以博客IT界的眼球??一起来看!! 一.演变之处--MVC 要了解struts必须 ...

  5. 日式风格小荷才露尖尖角

    简洁,秩序,干净,是所有人对日式风格的第一印象.日式风格的特点: 1.悠然自得,返璞归真,清新自然 2.善用原木色的搭配 3.讲究关联使用,以收纳为最 4.空间意识强,讲究 小 精  巧

  6. MSP未来可期,Bespin Global小荷已露尖尖角

    都说2017年是云MSP(公有云管理服务提供商)元年,那么2018年又有哪些新的发展趋势和热点呢?从近日Gartner公布的公有云MSP魔力象限也许可以看出一些端倪. 1 MSP市场的"魔力 ...

  7. 【小学信息技术教资面试】《蜻蜓立小荷》教案

    1.题目:蜻蜓立小荷 2.内容: 3.基本要求: (1)要求配合教学内容有适当的板书设计. (2)教学中注意师生间的交流互动. (3)学生学会粘贴和旋转图片. <蜻蜓立小荷>教案 一.教学 ...

  8. 玩不转大数据就别勉强了,或许“小数据”才是真正的终南捷径

    如今大多数人会经常听到"大数据",如果选择一个词来代替"大",大部分人的脑海里会出现"海量"."巨量"的字眼,但是,数据 ...

  9. h5商城模板_“公众号+小程序”才是做微信商城的正确方式

    如果你问做商城是用公众号好还是小程序好,而回答你只做其中一个的,那么你可以不理他了! 我的答案是:公众号 + 小程序!必须一起做 小程序是一个趋势. 虽然小程序在微信里有着很多独立入口,但是有好些重要 ...

最新文章

  1. VS2008 VS2010发布网站时如何产生固定命名的 Dll 文件
  2. 一文读懂你该了解的5G知识:现在别买5G手机
  3. ElasticSearch大数据分布式弹性搜索引擎使用
  4. php yii没有数据库吗,php – YII活动记录未插入数据库但未给出错误
  5. UITabelView使用流程
  6. 请问:这里的空应怎么填呀?
  7. ArduinoYun的电源插座
  8. 1 创建一个存储过程,以及对存储过程的调用 MySQL
  9. vba mysql odbc_使用VBA+ODBC+MySQL实现Excel网络版
  10. dpkg and apt
  11. java集合(6):TreeMap源码分析(jdk1.8)
  12. spring mvc + freemarker 整合
  13. java 8 Streams简介
  14. 如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)- 续(附demo)
  15. web APIS
  16. vba基本操作 -- 常用功能
  17. 谷歌浏览器地址栏记录怎么删除 Chrome浏览器地址栏记录清除方法
  18. python编程代码执行漏洞_代码执行漏洞 - 安全先师的个人空间 - OSCHINA - 中文开源技术交流社区...
  19. 我的世界java版联机不稳定_我的世界:你一定不会相信,时隔2年,网易这次真的“更新”了...
  20. Symantec 赛门铁克招聘 Security Response Manager

热门文章

  1. 2022年二级建造师报名需要准备什么
  2. 618年中大促如何选择蓝牙耳机?值得买的蓝牙耳机品牌
  3. 含泪整理 计算机网络详细八股文(第一部分)
  4. 【长期更新】日常学习中遇到的知识点
  5. 数据挖掘入门(一)基本理论
  6. win10计算机亮度无法调节,Win10电脑无法调节亮度怎么办 Win10系统不能调节屏幕亮度解决方法...
  7. java 窗体添加背景图片_Java Swing实现窗体添加背景图片的2种方法详解
  8. 【简单实现html页面指定某一个div局部刷新】
  9. PHP图片压缩到指定的大小
  10. 基于科大讯飞语音识别demo(离线)