Flutter笔记-控件1

前言

还未安装环境的童鞋可以看下这个flutter环境安装
不错的学习网站:
1.flutter官方中文网站:https://flutterchina.club/docs/
2.Flutter七日游(张风捷特烈):https://juejin.im/user/5b42c0656fb9a04fe727eb37
3.咸鱼官方博客:https://zhuanlan.zhihu.com/xytech
ps:前2个都比较基础,最后一个比较深入

计划将基础控件,布局控件结束后,再进行自定义绘制控件

基础控件

widget: 小器具,装饰品,窗口小部件;这里统一称为控件

要学flutter,肯定要先学会怎么使用控件
统计了一部分控件,做了一个表格:

widget flutter android
文本 Text TextView
按钮
漂浮按钮 RaisedButton Button
扁平按钮 FlatButton
边框按钮 OutlineButton
图片按钮 IconButton ImageButton
浮动动作按钮 FloatingActionButton FloatingActionButton
编辑框 TextField EditText
图片 Image ImageView
图标 Icon
复选框 Checkbox CheckBox
单选框 Radio RadioButton
单选开关 Switch Switch
底部弹框 SnackBar SnackBar
滚动控件 SingleChildScrollView ScrollView
线性滚动列表 ListView RecyclerView(LinearLayoutManager)
网格滚动列表 GridView RecyclerViewGridLayoutManager
自定义滚动 CustomScrollView RecyclerView(StaggeredGridLayoutManager)
滚动条 ScrollBar
弹框 Dialog AlertDialog
进度条 ProgressIndicator ProgressBar
圆形进度条 CircularProgressIndicator
线性进度条 LinearProgressIndicator
滑动条 Slider SeekBar
导航栏 AppBar ToolBar
选项栏 TapBar+TapBarView
底部导航栏 BottomNavigationBar
分割线 Divider
侧滑菜单 Drawer DrawerLayout
底抽屉 BottomSheet BottomSheet
流式标签 Chip Chip
圆形头像 CircleAvatar

控件很多,怎么学习来快呢?(ps:自我感觉)

学习之前,我们需要明确2个感念:

  1. StatelessWidget:无中间状态变化的widget,需要更新展示内容就得通过重新new,flutter推荐尽量使用StatelessWidget
  2. StatefullWidget:存在中间状态变化的widget,state类用于存放中间态,通过调用state.setState()进行此节点及以下的整个子树更新
    然后我们了解androidstudio的三个快捷键
快捷键 作用
stless 创建一个StatelessWidget
stful 创建一个StatefullWidget
stanim 创建一个StatefullWidget ,且包含动画

准备工作完成
接下来我们以ScrollBar为例,来学习这个控件:


工程目录

我们创建一个新的flutter工程时,系统会创建一大堆文件,那么我们的dart代码是在哪呢?
dart代码就在同级目录下的lib文件中
这里会发现同时存在android和ios 2个文件夹,对的,flutter编译后的应用是同时支持双端的(ps:或者说是三端,fuchsia已经在布局了)

enum TargetPlatform {
  /// Android: <https://www.android.com/>
  android,

  /// Fuchsia: <https://fuchsia.googlesource.com/>
  fuchsia,

  /// iOS: <http://www.apple.com/ios/>
  iOS,
}

回归正题,系统会创建一个main.dart文件

import 'package:flutter/material.dart';
//main 程序的主入口
void main() => runApp(MyApp());
//运行一个MaterialApp控件
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      //应用的图标名称
      title: 'Flutter Demo',
      //主题
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      //主界面
      home: MainPage()
      );
  }
}

这里代码基本固定了,你肯定要使用MaterialApp控件的,否则不好看(我这里不说不符合规范)

class MainPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    //脚手架
    return Scaffold(
        //相当于toolbar,导航栏
        appBar: AppBar(
          title: Text("flutter"),
        ),
        //正文
        body: ScrollBarDemo
    );
  }
}

我们要开始创建一个ScrollBar了,先看下其的源码:

class Scrollbar extends StatefulWidget {
  /// typically a [Scrollable] widget.
  const Scrollbar({
    Key key,
    @required this.child,
  }) : super(key: key);

  /// Typically a [ListView] or [CustomScrollView].
  final Widget child;

  @override
  _ScrollbarState createState() => _ScrollbarState();
}

源码说需要传递一个child,且必须为Scrollable,然后给了2个选择[ListView] 或 [CustomScrollView]
构造函数中的{}表示可选命名参数,@required表示child这个参数必须传递
Scrollable我们可以大胆的猜测,能滚动的控件肯定都包涵这个控件,所以我们选类似android中的那个ScrollView的控件SingleChildScrollView
然后我们写下代码

class ScrollBarDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scrollbar(
        child: SingleChildScrollView(
          child:Container()
        )
    );
  }
}

接下来看看SingleChildScrollView

class SingleChildScrollView extends StatelessWidget {
  const SingleChildScrollView({
    Key key,
    this.scrollDirection = Axis.vertical,
    this.reverse = false,
    this.padding,
    bool primary,
    this.physics,
    this.controller,
    this.child,
  }) : ...,super(key: key);//省略了断言
  final Axis scrollDirection; //滚动方向,水平和垂直
  final bool reverse; //是否反向,默认不启用
  final EdgeInsetsGeometry padding;//间距
  final ScrollController controller;//滑动控制器
  final bool primary;//默认true
  final ScrollPhysics physics;//超过物理边界后的动画效果
  final Widget child;
  ...
  @override
  Widget build(BuildContext context) {
    ...
    //内部创建了一个Scrollable控件
    final Scrollable scrollable = Scrollable(
      axisDirection: axisDirection,
      controller: scrollController,
      physics: physics,
      viewportBuilder: (BuildContext context, ViewportOffset offset) {
        return _SingleChildViewport(
          axisDirection: axisDirection,
          offset: offset,
          child: contents,
        );
      },
    );
    return primary && scrollController != null
      ? PrimaryScrollController.none(child: scrollable)
      : scrollable;
  }
}

源码可以看出,所有参数都是可选的,也就是说child其实也可以不传的,但这样就整个界面就是空白的

class ScrollBarDemo extends StatelessWidget {
  final String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  @override
  Widget build(BuildContext context) {
    return Scrollbar(
        child: SingleChildScrollView(
          child:Container(
              color: Colors.redAccent,
              width: 360,
              child: Column(
                //创建一个Text控件列表
                children: str.split("").map((c) => Text(c, textScaleFactor: 2.0,)).toList(),
              )
          )
        )
    );
  }
}

关于布局、监听、路由、手势等接下来在介绍


小小的总结一下
1.遇到一个widget,先看它的构造函数(可能有多个)
a. StatelessWidget,看其build方法做了什么
b. StatefulWidget,先找到createState(),然后在state类中看其build方法做了什么
2.配合源码中的英文注释加以理解
3.动手实践一番,测试效果

最后说明一下,flutter生成的代码都封装在libflutter.so中,不再是以前的.class文件

github代码:https://github.com/leaf-fade/flutterDemo


小尾巴:文章有错误的地方请不吝指出,会及时更改

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

推荐阅读更多精彩内容

  • 原文在此,此处只为学习 Widget与ElementWidget主要接口Stateless WidgetState...
    lltree阅读 4,510评论 0 1
  • 国庆后面两天在家学习整理了一波flutter,基本把能撸过能看到的代码都过了一遍,此文篇幅较长,建议保存(star...
    Nealyang阅读 4,343评论 1 17
  • 上篇文章从原生开发到Flutter教程(一)认识Flutter我们已经大概了解了Flutter的魅力并搭建好了开发...
    KavinZhou阅读 6,663评论 5 39
  • 老爷开了一家茶馆 门口放了一个朽棺 他采着,喝着,卖着自己的茶叶 陪老狗度过一天 一天又一天 思恋自己的老伴 老伴...
    伴月的清风阅读 249评论 0 1
  • 冬天的寒冷已然退却 春天的盎然逐步靠近 结束了一段旅程,开始新的青春 白云悠悠,清风徐徐 适合小憩的时光 拿起一本...
    机智豆丁阅读 288评论 0 0