flutter笔记3:基础语法、框架、控件

flutter环境和运行环境搭建好之后,可以开始撸码了,然而当你打开VScode,在打开项目文件夹后,摆在你面前的是main.dart被打开的样子,里面七七八八的已经写好了一堆代码,是不是很懵逼?

项目默认打开的main.dart

不要紧,人家官方文档上说了,flutter的玩家不需要Dart和移动端语言开发经验,只需要熟悉面向对象编程即可。
神马?面向对象也不懂?还是百度打打基础去吧。。。

先来点下酒菜

简单了解下上图中的几个标记的编号:
A. main.dart
此文件是每一个flutter项目的默认入口文件,也就是说每个flutter项目启动的时候,默认先运行这个文件的代码,这个入口文件理论上应该是可以配置的,不过我还不知道在哪配,大神请留言,嘿嘿。注意看它所在的路径,在项目根目录的lib文件下,而文件的后缀名.dart是flutter文件的格式,是不是很容易联想到flutter使用的dart语言。

B.import 'package:flutter/material.dart';
每一个.dart文件的第一行都会导入flutter/material.dart包,这个包是Flutter实现Material Design设计风格的基础包,里面有文本输入框(Text)、图标(Icon)、图片(Image)、行排列布局(Align)、列排列布局(Column)、Decoration(我也不知道是啥)、异步(%#¥@晕倒..)、动画等等等等控件,大家可以理解为网页中的按钮、标题、选项框呀等等控件库吧。

Material Design是啥?是谷歌推出的一套视觉设计语言。比如有的APP可以换皮肤,而每一套皮肤就是一种设计语言,有古典风呀炫酷风呀极简风呀神马的,而Material Design就是谷歌风,有兴趣的同学可以学习了解一下Material Design官方原版Material Design中文翻译版,这是每一个产品经理的必修教材。

C.void main() => runApp(new MyApp());
有点像ES6语法的箭头函数是不是?对学习过前端开发的同学是不是很熟悉呀,意思等同于:

void main() {
return runApp(Widget app);
}

这里的main()函数是Dart程序的入口,也就是说,Flutter程序在运行的时候,第一个执行的函数就是main()函数,结合A的入口文件,flutter项目默认执行的第一句代码,就是main.dart文件里的void main() => runApp(new MyApp());

D和E.StatelessWidgetStatefulWidget
这是flutter最基础的的两种控件类,分别叫无状态类和有状态类,两者的差别在于是否有状态,玩家创建的所有控件都继承自这两个控件。当你想展示的内容只需要改动控件本身的配置信息就可以实现时,例如文本、图片等,可以考虑使用无状态控件(StatelessWidget)。如果你想展示的内容是可以动态改变才能实现时,例如滚动列表、动画效果等,可以考虑使用有状态控件(StatefulWidget)。

其实我也不是很明白,StatefulWidget还有生命周期一说,具体怎么回事,大家可以参考何小有《Flutter框架基础》,如果你悟性好,分分钟贯通也说不定。

写一个APP试试?

前面写了一大堆废话,高手们已经不耐烦,萌新们看不懂我也不管了,撸一管官方萌新教程先~

第一步

main.dart里的代码替换成这个:

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Welcome to Flutter',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Welcome to Flutter'),
         ),
        body: new Center(
          child: new Text('Hello World'),
        ),
      ),
    );
  }
}

保存之后,到终端里输入这个:

flutter doctor
flutter run

看看你的测试机都发生了什么,好了,恭喜!你的flutter人生的第一个hallo world告成~!

牢记这一点,flutter中的一切都是控件(Widget,有的文章称呼组件,就当作一个意思吧),控件是可以嵌套的,嵌套后就会形成组件树。

上面的代码可以简单看看,能懂多少是多少吧,对熟悉面向对象的同学应该没有难度。

第二步

打开文件pubspec.yaml,在这里加一句代码english_words: ^3.1.0并保存:

引入外部包

你会看到终端有动作:


引包后热更新

再回到*main.dart文件,加一句代码import 'package:english_words/english_words.dart';

引入的包从未使用过

这时控制台的问题栏也会弹出一个提示:

不好好利用引入的包的后果

这是flutter的一个撸码规则,为了保证代码的高效和简洁,避免引入无用的包造成程序臃肿、运行效率低下,然后我们再修改一下代码并保存:


字符串的驼峰格式化

这时候APP里的Hello World变成了下面这个样子:

好不好玩呀

到终端中按 r 键,在APP中发现什么变化都没有,而按 R 键,APP重启,屏幕中央的字符串随机改变了,说明APP一旦启动后,玩家创建的无状态控件实例中的属性值定义后,刷新页面不会再更新,官方的说法是无状态控件实例中的属性值为final类型,意味着一旦定义将无法变更,只有APP重启后,重新执行代码,这时候重生了控件实例,所以屏幕中央的字符串改变了,但是用 r 还是不会变。

第三步

这次来点有难度的,用到了StatefulWidget控件,请将main.dart的代码替换为:

import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // final wordPair = new WordPair.random();
    return new MaterialApp(
      title: 'Welcome to Flutter',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Hello Flutter'),
        ),
        body: new Center(
          // child: new Text('Hello World'),
          // child: new Text(wordPair.asPascalCase), //asPascalCase 驼峰样式,字符串中的每个单词的首字母都会大写
              child: new RandomWords(),  //定义子控件为有状态控件RandomWords的实例
        ),
      ),
    );
  }
}
//定义了一个有状态控件,继承自StatefulWidget
class RandomWords extends StatefulWidget {
  @override
  createState() => new RandomWordsState();  //为StatefulWidget控件RandomWords定义一个状态类
}
//定义了一个状态控件,继承自状态类State<RandomWords>,<RandomWords>指明这个状态控件是RandomWords控件的
class RandomWordsState extends State<RandomWords> {
    @override
    Widget build(BuildContext context) {
      final wordPair = new WordPair.random();
      return new Text(wordPair.asPascalCase);
    }
}

保存代码后,再到终端,每按一次 r 键,APP中央的字符串就会随机改变,这就是StatefulWidget类的特性,其实例内的属性值可以在对象实例化后随意变更,一个StatefulWidget控件至少包含两个类,一个是用于实例化的StatefulWidget类,一个是它的State状态类。纯粹的StatefulWidget控件本身是不可变的,但是它的State类会在StatefulWidget控件的整个生命周期持续存在。

经过这么一折腾,我也对StatefulWidget和StatelessWidget的特性有个了一个简单的认识,不知道小伙伴们感觉如何呀,如果还有不明白的地方,请在留言中提问,flutter圈子说不定哪个大牛心情好会有解答哟。

本篇就介绍到这里,大家可以自行敲敲代码,多体验体验,从知道flutter到现在36小时,而我能写到这里,首先感谢技术达人狐神的大力支持,帮我拉来了flutter先驱何小有和一梭子前端大神,再者感谢何小有flutter圈子的入门扫盲贴投稿,也感谢大家的支持,我也就不再废话什么自我激励了,总之 加油~!

再啰嗦一句广告,对flutter感兴趣的小伙伴可以关注我,欢迎大家到Flutter圈子中投稿,也可以联系管理员加入我们的flutter微信群嗨聊,谢谢捧场~!
flutter 中文社区(官方QQ群:338252156)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,598评论 25 707
  • Flutter应用程序是由一些零散且有关联的控件组成的,那么控件是什么?控件,就是你在屏幕上看到那些东西。例如,一...
    何小有阅读 17,265评论 4 31
  • 今天才知道,原来哭的够久眼睛就可以肿起来,而不必等到一觉醒来时,唤醒快要被遗忘的心情。 而我,是为一只狗。 它是一...
    橙子柚子西葫芦阅读 398评论 1 2
  • 上网搜了一大堆,但也没有解决问题 参考了别人的UC开发调试: 费了好大劲终于在PC上的chrome实现了调试,然而...
    竹杖芒鞋轻胜码阅读 1,484评论 0 0
  • 当一种日子过久了,有了某种的味道,这种味道会深深地烙在记忆里,缭绕在回忆人的心头,挥之不去。
    Ctian阅读 127评论 0 0