前言

本篇文章对于熟悉 flutter 或者 dart 的小伙伴来说可能觉得比较简单,但是对于初学者或者没用过的小伙伴还是有些收获的。

背景

说到 map 妙用的发现,还要归功于 Tooltip 的研究。

在研究这个 Widget 的时候,看到了它的源码 demo,所以发现了这个 map 的妙用。

那么妙用在哪呢?

统一处理

我们在上节课说到了 Expanded 的比例布局。

源代码如下:

return Column(
children: <Widget>[
Expanded(
flex: 1,
child: Container(
color: Colors.red,
),
),
Expanded(
flex: 1,
child: Container(
color: Colors.blue,
),
),
Expanded(
flex: 1,
child: Container(
color: Colors.grey,
),
),
],
);

使用 map 可以转换为如下代码:

return Column(
children: <Widget>[
Container(
color: Colors.red,
),
Container(
color: Colors.blue,
),
Container(
color: Colors.grey,
),
]
//.map((Widget widget){ 也是可以的
.map<Widget>((Widget widget){
return Expanded(
flex: 1,
child: widget,
);
})
.toList(),
);

这样就统一管理了,减少了冗余代码,更加优雅了~

但是有时候可能我们有 10 个子组件,但是可能有 8 个需要统一处理,有两个不需要,怎么办呢?

我们可以利用 widget 的 标识属性 key 来处理。

以上面代码为例,假设我希望第一个子组件占两块比例,另外两个都占一块比例。

可以修改代码如下:

return Column(
children: <Widget>[
Container(
key: Key('1'),
color: Colors.red,
),
Container(
color: Colors.blue,
),
Container(
color: Colors.grey,
),
]
//.map((Widget widget){ 也是可以的
.map<Widget>((Widget widget){
print(widget.key);
int flex = 1;
if (widget.key == Key('1')) {
flex = 2;
}
return Expanded(
flex: flex,
child: widget,
);
})
.toList(),
);

可以看到我们通过 key 对第一个子组件做了区分处理。

另外正如学习设计模式的时候,不要为了设计而设计。

Map 的妙用能够使代码更优雅,但是我们也不要为了优雅而优雅。

而是真的适用你的场景,我们再使用。判别就是能否减少冗余代码。

其实上面的 map 用法有点让我想起 RxJava 里面 map 的使用。

我们可以认为上面的 map 是对一个列表里的每个元素按照特定规则进行处理。

.. Operator

.. 操作符在 dart 里面的描述是 cascade,翻译出来是级联。

这边的一个用法其实是链式写法。

什么意思呢?

我们举 StringBuffer 这个例子。

dart 里面的 StringBuffer 和 java 里面的 StringBuffer 是有差别的。

首先我们看下下面的字符串连接用 java 实现,代码如下:

		StringBuffer valueBuffer = new StringBuffer();
valueBuffer.append("I")
.append(" ")
.append("love")
.append(" ")
.append("Flutter");
System.out.println(valueBuffer.toString());

如果用 dart 实现的话,首先第一个点就是 dart 里面的 StringBuffer 没有 append 方法,取而代之的是 write 方法。

你以为只是上面的 append 改为 write?

如果你将 append 改为 write,如下

  StringBuffer valueBuffer = new StringBuffer();
valueBuffer.write("I")
.write(" ")
.write("love")
.write(" ")
.write("Flutter");
print(valueBuffer.toString());

编译器会提示下面错误:

The expression here has a type of 'void', and therefore cannot be used.

如果运行,也会报下面错误:

Error compiling to JavaScript:
DetailedApiRequestError(status: 400, message: main.dart:3:15:
Error: This expression has type 'void' and can't be used.
valueBuffer.write("I")
^
main.dart:4:6:
Error: The method 'write' isn't defined for the class 'void'.
.write(" ")
^^^^^
Error: Compilation failed.
)

很明显,write 方法返回类型是 void,因此不能这样写。

所以这个时候 .. 的作用就出现了,你只需要把 .append 改为 ..write 即可,如下:

  StringBuffer valueBuffer = new StringBuffer();
valueBuffer..write("I")
..write(" ")
..write("love")
..write(" ")
..write("Flutter");
print(valueBuffer.toString());

上面所有代码输出都是一样的,就是 I love Flutter

另外 Tooltip Demo 地址:

Flutter map 妙用及 .. 使用的更多相关文章

  1. Flutter Map<String, dynamic> 、List<String> a-z 排序

    字符串从 a-z 排序. Map<String, String> map = XXX, List<String> keys = map.keys.toList(); // ke ...

  2. Flutter 即学即用系列博客——09 EventChannel 实现原生与 Flutter 通信(一)

    前言 紧接着上一篇,这一篇我们讲一下原生怎么给 Flutter 发信号,即原生-> Flutter 还是通过 Flutter 官网的 Example 来讲解. 案例 接着上一次,这一次我们让原生 ...

  3. Flutter 即学即用系列博客——08 MethodChannel 实现 Flutter 与原生通信

    背景 前面我们讲了很多 Flutter 相关的知识点,但是我们并没有介绍怎样实现 Flutter 与原生的通信. 比如我在 Flutter UI 上面点击了一个按钮,我希望原生做一些处理,那么原生怎么 ...

  4. 记录一个python公式罗列的方法 join()方法和map()方法的妙用

    题干: 怎样将一个列表中的元素读出,并列出计算式子 比如:[,,,] 输出:+++ = 列表中的元素个数不定 小白和大神的方法: #小白的 numlist=[,,,] sum1='' cal='+' ...

  5. new Map的妙用

    const actions = new Map([ [1, ['processing','IndexPage']], [2, ['fail','FailPage']], [3, ['fail','Fa ...

  6. Flutter Dart List.map() 获取下标

    class HomePageState extends State{ final topTitles = ['审批单', '机票列表', '客服']; final topIcons = ['asset ...

  7. flutter 中 List 和 Map 的用法

    list集合 在Dart中,数组是List对象,因此大多数人只是将它们称为List.以下是一个简单的Dart的List: 创建一个int类型的list List list = [10, 7, 23]; ...

  8. 【源码篇】Flutter GetX深度剖析 | 我们终将走出自己的路(万字图文)

    前言 人心中的成见是一座大山,任你怎么努力都休想搬动. 这是电影<哪吒>里申公豹说的一句话,也是贯彻整部电影的一个主题:或许这句话引起了太多人的共鸣:35岁职场危机,大厂卡本科学历,无房无 ...

  9. EF6 Power Tools的妙用和问题

    环境:vs2013+EF:6.1.3.0+Power Tools:Beta 4 power tools:是一个反向工程,在已有数据库的情况下,可以利用它生成Code Frist模式的代码. 问题: 它 ...

随机推荐

  1. 我和Python的Py交易》》》》》》数据类型

    Python里的变量 ---门牌 Python在使用变量之前无须定义它的类型,但是必须声明以及初始化该变量. Python中给变量赋值就是声明,初始化变量(也就是创建一个相应数据类型的对象,而那些数据 ...

  2. 关于EffictiveC++笔记

    我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」.

  3. Django-ORM增删改查

    ORM对单表进行增删改查 一,增加记录 #第一种方式 b=Book(name="Linux",price=66,author="kelvin",pub_date ...

  4. python设计模式-观察者

    定义: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖的对象都会得到通知并被自动更新. 观察者模式是对象的行为模式,又叫发布-订阅(pubish/subscribe)模式,模型 ...

  5. 重磅!!!微软发布ASP.NET Core 2.2,先睹为快。

    我很高兴地宣布ASP.NET Core 2.2现在作为.NET Core 2.2的一部分提供! 如何获取? 您可以从.NET Core 2.2下载页面下载适用于您的开发机器和构建服务器的新.NET C ...

  6. Java后端框架之Spring Boot详解,文末有Java分布式实战项目视频可取

    在 Java 后端框架繁荣的今天,Spring 框架无疑是最最火热,也是必不可少的开源框架,更是稳坐 Java 后端框架的龙头老大. 用过 Spring 框架的都知道 Spring 能流行是因为它的两 ...

  7. vue.js框架原理浅析

    vue.js是一个非常优秀的前端开发框架,不是我说的,大家都知道. 首先我现在的能力,独立阅读源码还是有很大压力的,所幸vue写的很规范,通过方法名基本可以略知一二,里面的原理不懂的地方多方面查找资料 ...

  8. 从零单排学Redis【铂金一】

    前言 只有光头才能变强 好的,今天我们要上铂金段位了,如果还没经历过青铜和白银和黄金阶段的,可以先去蹭蹭经验再回来: 从零单排学Redis[青铜] 从零单排学Redis[白银] 从零单排学Redis[ ...

  9. spring boot 文件上传大小限制

    错误信息 : Spring Boot:The field file exceeds its maximum permitted size of 1048576 bytes. 解决方法一:在启动类添加如 ...

  10. 基于百度AI开放平台的人脸识别及语音合成

    基于百度AI的人脸识别及语音合成课题 课题需求 (1)人脸识别 在Web界面上传人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口识别人脸特征,接收平台返回的人员年龄.性别.颜 ...