Flutter入门三部曲(1) - 基础认识

image.png

为什么选择Flutter

  1. 高开发效率。Hot road
  2. 跨平台运行
  3. 对比RN,Weex 更加流畅
    image.png

    看到整体的架构图,它是由dart完成上层的framework,然后由通过skia来完成图形的绘制。

环境搭建和安装

环境搭建可以直接参照文档来进行。
值得注意的是,在国内,设置环境变量会安装的更快

export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

或者使用交大(Shanghai Jiaotong University Linux User Group
)的地址

export PUB_HOSTED_URL: https://dart-pub.mirrors.sjtug.sjtu.edu.cn/
export FLUTTER_STORAGE_BASE_URL: https://mirrors.sjtug.sjtu.edu.cn/

创建项目

flutter create flutter_start

文件目录

生成了文件目录如下。快速认识一下


项目目录.png

这里面需要关注的目录如下:

- android //生成的android目录。里面是根据脚本生成的android项目
- ios //同上,ios项目
- lib //这个目录下面是运行的代码
  - main.dart //代码文件
- test //测试文件
 - widget_test.dart //测试代码
- pubspec.yaml //项目的配置文件
配置文件pubspec.yaml

顾名思义。通过这个文件来配置相关的依赖。
在配置文件中,我们可以配置第三方库。和使用的图片资源

#这里是配置项目的名字和说明
name: flutter_start
description: A new Flutter project.

# 配置项目依赖
dependencies:
  flutter:
    sdk: flutter

  #这里是加入了ios的图标。默认情况下,ios手机上,使用ios的图标
  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.0

dev_dependencies:
  flutter_test:
    sdk: flutter

#项目的具体配置
flutter:
  # 将MaterialDesign的图标和字体使用并打包
  uses-material-design: true

  # 可以通过下面的方式,定义Assets内的文件
  # assets:
  #  - images/a_dot_burr.jpeg
  #  - images/a_dot_ham.jpeg
 
  # 像下面这样定义字体文件。每组字体文件都需要一个Family 
  # example:
  # fonts:
  #   - family: Schyler
  #     fonts:
  #       - asset: fonts/Schyler-Regular.ttf
  #       - asset: fonts/Schyler-Italic.ttf
  #         style: italic
  #   - family: Trajan Pro
  #     fonts:
  #       - asset: fonts/TrajanPro.ttf
  #       - asset: fonts/TrajanPro_Bold.ttf
  #         weight: 700
  • 第三方库
    这里可以不断加入自己的第三方依赖。第三方依赖可以通过github上找到,也可以通过dartlang.org这个成熟的生态内,找到想要的插件

  • 不同尺寸的图片资源

参考官方文档
Adding Assets and Images in Flutter
Where do I store my resolution-dependent image files?

Flutter遵循简单的基于密度的格式,如iOS。assets可能是1.0x2.0x3.0x,或任何其他乘数。虽然Flutter中没有dp的概念。但是同样使用的是逻辑像素,它们与设备无关的像素基本相同。MediaQuery中的 devicePixelRatio 表示单个逻辑像素中的物理像素的比率。

Android density qualifier Flutter pixel ratio
ldpi 0.75x
mdpi 1.0x
hdpi 1.5x
xhdpi 2.0x
xxhdpi 3.0x
xxxhdpi 4.0x

放置的项目如下图

images/my_icon.png       // Base: 1.0x image
images/2.0x/my_icon.png  // 2.0x image
images/3.0x/my_icon.png  // 3.0x image

之后,它会自动拷贝到对应的android或者ios的项目文件夹中。

基础的控件及界面

基础认识

首先,还是先来一个感性的认识。

Flutter中几乎所有的都是Widget

Flutter具有一致的统一对象模型:widget。而且Flutter 遵循Simple is fast的原则,每个Widget都是用户界面一部分的不可变声明。(这意味着每次改变都会重建widget

可以通过告诉框架使用另一个widget替换层次结构中的widget来响应事件,例如用户交互,替换后框架会比较新的和旧的widget,并高效地更新用户界面。

组合 > 集成

Widget本身通常由许多更小的、单一用途widget组成,这些widget结合起来产生强大的效果。例如,Container是一个常用的widget, 由多个widget组成,这些widget负责布局、绘制、定位和调整大小。具体来说,Container由 LimitedBoxConstrainedBoxAlignPaddingDecoratedBox、 和Transform组成。 您可以用各种方式组合这些以及其他简单的widget,而不是继承容器。

类层次结构很浅且很宽,可以最大限度地增加可能的组合数量。

image.png
构建widget

您可以通过实现widget的build返回widget树(或层次结构)来定义widget的独特特征 。 这棵树更具体地表示了用户界面的widget层次。

更多关于这部分的知识后面继续介绍。

界面编写

这边文章我们对这部分,先浏览一遍。

其实Flutter界面的书写的体验,很像web前端。只是没有用css而已。
建议优先看一下这边文章
Flutter for Web (HTML/CSS) Developers

自动生成的main.dart
import 'package:flutter/material.dart';
//定义一个Main方法。Main方法中用简单RunApp就可以执行我们定义的Widget
void main() => runApp(new MyApp());
/*
Flutter写成的都是UI主键。主要分 StatelessWidget 和 StageWidge
整体的入口可以写成 StatelessWidget
*/
class MyApp extends StatelessWidget {
  //这个Widget就是我们App的最基层的Widget了
  //传入BuildContext给我们使用。
  @override
  Widget build(BuildContext context) {
//这样就可以直接使用Flutter为我们封装好的MaterialApp这个主题的了.从源码可以看到这个是个StatefulWidget
    //[home], [routes], [onGenerateRoute], or [builder] 这个主题下的这些方法不能都为空!!
    return new MaterialApp(
      title: 'Flutter Demo',
      //定义主题
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

//statefulWidget ,因为Widget都是无状态的,所以如果需要有状态的话,`state`这个类来进行维持
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

//flutter中状态的持有类
class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    //这点和小程序很类似。调用setState进行状态同步和刷新。如果不调用这个方法,只是改变值,界面不会发生变化
    setState(() {
      _counter++;
    });
  }

  //state中的`build`方法,会自动在`setState`方法后调用。
  @override
  Widget build(BuildContext context) {
  //Scaffold可以理解程相当于一个html 它的body就是主要的内容。
    //同时它其实是满足MD的。所以它还能提供对应的组件
    //比如 AppBar .Drawer floatingButton等等
    return new Scaffold(
      appBar: new AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: new Text(widget.title),
      ),
      //这里可以初步的看到,如果想要布局居中显示,可以先包裹一层`Center`
      body: new Center(
       //因为是竖直的布局,所以再次包裹一层Column
        child: new Column(
          //使用这个属性,让居中竖直排列
          mainAxisAlignment: MainAxisAlignment.center,
         //children中传入其他组件
          children: <Widget>[
            new Text(
              'You have pushed the button this many times:',
            ),
            new Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: new FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: new Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

运行后的界面如下


flutter.gif

同时点击按钮,界面会发生同步。

总结

  • 熟悉了Flutter的项目配置
  • 对大体的界面书写有了一定的认知

下一遍,我们将具体更多学习Flutter中Widget的知识

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

推荐阅读更多精彩内容