用Flutter 写一个简单页面

级别: ★☆☆☆☆
标签:「Flutter」
作者: WYW
审校: QiShare团队


前言

本文适用于对Flutter 感兴趣的初学者。笔者会带大家写一个简单页面,使大家对Flutter有一个简单地了解。

一、Flutter 简介

Flutter是Google的UI工具包,可使用一套代码库,为移动,Web和桌面构建漂亮的原生编译的应用程序。

Flutter实现了一个自绘引擎,使用自身的布局、绘制系统,绘制界面。

1. Flutter 框架架构图

FlutterSystemStructure.png

Flutter框架图简单说明:

  • Framework 层使用 Dart 实现,Material 层 包含 Android 风格的 WidgetCupertino 层 包含 iOS 风格的 WidgetWidgets 层包含 WidgetRendering 层包含控制渲染的库;Animation 层包含动画的库;Painting 层包含控制绘制的库;Gestures 层包含手势的库;Foundation层 包含基础库(比如确定所属平台(Android、iOS等)的API、又如print、debug 相关的API)。

  • Engine 层使用 C++ 实现,Skia 层是开源的二维图形库。Dart层包含 Dart 相关的API, Text 层包含文字绘制展示相关的API。

在 Flutter 中我们所看到的内容都是由 Widget 控制显示的,我们所看到的交互效果也是由 Widget 来控制的。在Flutter 中一切都是 Widget。

本文中,笔者会介绍的Widget有 StatelessWidgetStatefulWidgetTextImageFlatButtonGestureDetectorListView 等。

2. 相关Widget介绍如下:

  • StatelessWidget 是无状态的 Widget ,当我们要展示的 Widget 不需要改变显示内容的时候,使用StatelessWidget即可;

  • StatefulWidget 是有状态的 Widget ,当我们要展示的 Widget 需要改变显示内容的时候,需要使用 StatefulWidgetStatefulWidget 的子类相当于存放了 State 的配置信息。StatefulWidget的界面显示效果由 State 来控制展示。 当 StatefulWidget 对应的界面数据变化后,调用 setState() 方法,然后系统会运行 buildContext() 就可以做到更新界面的效果。

  • Column 用于展示成 排列的 Widget;

  • Container 是一个容器Widget;

  • Text 用于展示文字,相当于 iOS 中的 UILabel

  • Image 用于展示图片;

  • FlatButton 相当于 iOS 中的 UIButton ,用于处理交互事件,同时,Flutter中可以使用GestureDetector 对Widget 进行包裹,也可以达到具备交互的效果的目的;

  • ListView 相当于 iOS 中的 UITableView ,用于展示列表内容。

  • ListTile 相当于iOS 中的 UITableViewCell

三、使用Flutter创建一个简单页面

1. 页面显示Hello World

显示 Hello World 需要使用 Text Widget

功能代码如下:

Text('Hello World'),

2. 创建 Flutter 应用方式

  • 笔者使用的工具是Visual Studio Code

  • 打开 Visual Studio Code 后,command + shift + p ,然后选择创建Flutter New Project ,之后输入小写字母的项目名即可。

  • 展示Hello World 的相关代码如下:

笔者已经按照自己的理解,加了部分注释。

// 应用程序执行入口
void main(List<String> args) {
  // 初始化指定的Widget,并把Widget渲染效果绘制到屏幕上
  runApp(MaterialApp(
    title: '安卓切换任务管理时任务名',
    home: QiStatelessApp(),
  ));
}
// 创建一个继承自Stateless的Widget
class QiStatelessApp extends StatelessWidget {
  // 重写build 方法,build 方法返回值为Widget类型,返回内容为屏幕上显示内容。
  @override
  Widget build(BuildContext context) {
    // MaterialApp 控制界面风格为安卓风格
    // CupertinoApp 界面风格为iOS 风格
    return MaterialApp(
      title: '安卓切换任务管理时任务名',
      // debugShowCheckedModeBanner: false,
      // Scaffold:脚手架 用于展示基础框架结构,如appBar、body、bottomNavigationBar
      home: Scaffold(
        // AppBar:相当于iOS 的导航栏
        appBar: AppBar(
          // AppBar上的显示内容
          // Text 用于展示文本内容,相当于iOS中的UILabel
          title: Text('App Bar 展示内容'),
        ),
        // body:AppBar及BottomNavigationBar之间展示的内容
        // Center 是用于把子Widget 居中的Widget
        body: Center(
          child: Text('Hello World'),
        ),
        // 相当于iOS 中的UITabBar
        bottomNavigationBar: BottomNavigationBar(
          type: BottomNavigationBarType.fixed,
          items: [
            BottomNavigationBarItem(icon: Icon(Icons.work), title: Text('工作')),
            BottomNavigationBarItem(
                icon: Icon(Icons.security), title: Text('安全')),
          ],
          onTap: (tappedIndex) {
            print('tappedIndex:$tappedIndex');
          },
        ),
      ),
    );
  }
}

上述代码整体效果图如下:

QiStatelessApp.png

)

下述代码中title传入的值的作用为:在安卓手机上显示出来任务管理器的时候,显示为任务名。

runApp(MaterialApp(
    title: '安卓切换任务管理时任务名',
    home: QiStatelessApp(),
  ));

示意图如下:

androidTaskName.png

另外 MaterialApp 控制界面风格为安卓风格,CupertinoApp 界面风格为iOS 风格。

三、Flutter简单页面效果

在本文中,笔者将会做一个如下效果的Flutter 页面。

FlutterPage.png

四、上述页面相关Widget介绍

下边笔者依次介绍上述页面用到的Widget。

(1) Text

Text('Hello World'),

Text 用于展示文字内容。

(2) Image

Image.network(
              'https://upload.jianshu.io/collections/images/1673367/8.png?imageMogr2/auto-orient/strip|imageView2/1/w/240/h/240'),

Image 用于展示网络图片

(3) FlatButton

FlatButton(
    child: Text(
      'FlatButton',
      style: TextStyle(
        backgroundColor: Colors.yellow,
      ),
    ),
    onPressed: () {
      print('press FlatButton');
      setState(() {
        _centerString = 'Change Self';
      });
    },
  ),

FlatButton 可以显示内容也可以接受交互。

(4) GestureDetector

  GestureDetector(
    child: Text(
      'GestureDetector',
      style:
          TextStyle(color: Colors.red, backgroundColor: Colors.yellow),
    ),
    onTap: () {
      print('GestureDetector');
    },
  ),

GestureDetector 可以达到包裹内容并接受交互的目的。

(5)Column

Column(
        children: <Widget>[
          Text('Hello World'),
          Icon(Icons.share),
          FlatButton(
            child: Text('FlatButton'),
            onPressed: (){
              print('press FlatButton');
            },
          ),
        ],
      ),

Column 用于列排展示 children 内容。

(6)ListView

ListView 相当于列表。使用 ListTile 来展示列表内容。

ListView(
    children: <Widget>[
      ListTile(
        title: Text('姓名'),
        trailing: Text('FlutterDev'),
      ),
      ListTile(
        title: Text('性别'),
        trailing: Text('男'),
      ),
      ListTile(
        title: Text('地区'),
        trailing: Text('河北'),
      ),
      ListTile(
        title: Text('手机'),
        trailing: Text('176*****9396'),
      ),
    ListTile(
      title: Text('其他'),
      subtitle: Text('subtile'),
      leading: Icon(Icons.security),
      trailing: Icon(Icons.share),
      onTap: () {
        print('ListTile1');
      },
    ),
    ],
  ),

(7) ListTile

ListTile 是列表中的条目。

// 列表条目
ListTile(
  // 标题
  title: Text('ListTile1'),
  // 子标题
  subtitle: Text('subtile1'),
  // 标题左侧的Widget
  leading: Icon(Icons.security),
  // 标题右侧的Widget
  trailing: Icon(Icons.share),
  onTap: () {
    print('ListTile1');
  },
),

五、页面跳转及回传数据

页面跳转并传值可以通过构造方法传值。

Navigator.push(context,
    MaterialPageRoute(builder: (context) {
  return QiListViewPage('iOS Dev');
})).then((onValue) {
  print('回传的数据:$onValue');
});

回传数据。

Navigator.pop(context, 'FlutterDev');

六、相关代码

import 'package:flutter/material.dart';

// 应用程序执行入口
void main(List<String> args) {
  // 初始化指定的Widget,并把Widget渲染效果绘制到屏幕上
  // MaterialApp 控制界面风格为安卓风格
  // CupertinoApp 界面风格为iOS 风格
  // runApp(MaterialApp(
  //   title: '安卓切换任务管理时任务名',
  //   home: QiStatelessApp(),
  // ));

  runApp(MaterialApp(
    title: '安卓切换任务管理时任务名',
    home: QiStatefulApp(),
  ));
}
// QiStatefulApp 是有状态的Widget
class QiStatefulApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return QiState();
  }
}
QiState负责渲染QiStatefulApp要显示的内容
class QiState extends State<QiStatefulApp> {

  @override
  Widget build(BuildContext context) {
    ......
    );
  }
}

更多代码见Demo:QiFlutterPage

七、参考学习资料


推荐文章:
5分钟,带你迅速上手Markdown语法
Swift 5.1 (2) - 运算符
Swift 5.1(1) - 基础
iOS UI状态保存和恢复(三)
iOS UI状态保存和恢复(二)
iOS UI状态保存和恢复(一)
iOS 中精确定时的常用方法
Sign In With Apple(一)

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

推荐阅读更多精彩内容