字符串根据布局约束可能跨越多行或者只显示在一行.
style 参数是可选的.如果忽略,默认使用最近的父组件的 DefaultTextStyle.如果给定的样式 TextStyle.inherit 属性为 true(默认),则给定的样式将和最近的父组件的 DefaultTextStyle 合并.这个合并操作很有用,例如使用默认的 font family 和大小使字体 bold.
使用 Text.rich 构造方法,Text 组件可以使用不同的 TextSpan 样式显示一段文字.
交互使用 GestureDetector 组件,设置 GestureDetector.onTap 处理器可以使 Text 响应 touch 事件.
在 material design 设计 app 中,可以使用 FlatButton 代替,如果不适合的话,最少都应该使用 InkWell 代替 GestureDetector.
为了使文本分部分交互,使用 RichText,在相关部分文本上指定 TapGestureRecognize 作为 TextSpan.recognizer.
继承 🌲Object > ...
显示图片的组件.
提供了以下几个不同用途的构造方法:
new Image: 从 ImageProvider 中获取图片.
new Image.asset: 使用 key 从 AssetBundle 中获取图片
new Image.network: 从 URL 中获取图片
new Image.file: 从 File 中获取图片
new Image.memory: 从 Uint8List 中获取图片
支持以下图片格式: JPEG,PNG,GIF,Animated GIF,WebP,Animated WebP,BMP,WBMP.
为了自动实现像素密度级的资产管理, 确保在 MaterialApp,WidgetsApp,MediaQuery组件树中使用 AssetImage 指定的 Image 组件.
图片是用 paintImage 画出来的,它包含了 Image 中的不同属性详情描述.
类似组件
Icon
new Ink.Image: 在 material app 中推荐使用(特别是图片在 Material 中,而且上面有 InkWell)
Image: dart:ui 提供
继承 ...
以垂直数组方式显示子组件的组件.
想要某个子组件扩展填充垂直空间,使用 Expanded 组件包装即可.
Column 组件不会滑动(通常如果 Column 中的多个子组件超出了可用空间,则会报错).如果有一排组件,而且想要在空间不足时能滑动,考虑使用 ListView.
横向排列考虑使用 Row.
如果只有一个子组件,考虑使用 Align 或 Center 定位组件.
如果传入的垂直约束是无边界的如果一个 Column 组件有一个或多个 Expanded 或 Flexible 组件,并且被放在另一个 Column 或 ListView 或其他不提供最大高度约束上下文的组件中,那么将会收到一个运行时异常,表明有非 0 flex 的子组件,但是其垂直约束是无边界的.
正如异常表现出来的问题,使用 Flexible 或 Expanded 意味着接下来布局其他的子组件时必须把剩余的空间平均分配,而如果传入的垂直约束是无边界的话,剩余的空间就变成无限的.
解决该问题的关键在于为什么 Column 会接收到无边界的垂直约束.
一个可能的原因是 Column 被放在了另一个 Column (内部 ...
以横向数组的方式显示子组件的组件.
为了使其一个组件填充剩余可用空间,可以使用 Expanded对其进行包装.
Row 组件不会滑动(通常一个Row组件中的子组件过多已经超出了可用空间,则会导致错误).如果在不足的空间中想要一排组件能够滑动,可以考虑使用 ListView.
Column 竖向排列.
如果仅有一个子组件,那么可以考虑使用 Align 或 Center 定位该子组件.
为什么我的 row 有一条黄黑相间的条纹?如果 Row的内容是不可伸缩扩展的(没有使用 Expanded 或 Flexible 组件包装),连在一起比 row 本身更宽,那么我们就称 row 溢出了.如果 row 溢出了,那么 row 就没有多余的空间去分配给它的Flexible 和 Expanded 子组件. row 会在边上显示一条黄黑相间的条表示溢出了.如果 row 外有空间,那么溢出亮将会以红色字体打印出来.
布局算法
接下来介绍 framework 是如何渲染 Row 的.查看 BoxConstraints 了解盒布局模型.
Row 的布局分以下 6 步:1、使用无边界的水平约束和传入的垂直约 ...
flutter 的核心设计是将整个应用的各个部分各个层级都看作 Widget 来渲染,所以按照 Widget 的分类来学习会比较全面。
基础组件Container
Row
Column
Image
Text
Icon
RaisedButton
Scaffold
AppBar
FlutterLogo
Placeholder
Material 组件结构和导航
Scaffold
AppBar
BottomNavigationBar
TabBar
TabBarView
MaterialApp
WidgetsApp
Drawer
按钮
RaisedButton
FloatingActionButton
FlatButton
IconButton
PopupMenuButton
ButtonBar
输入框和选择框
TextField
Checkbox
Radio
Switch
Slider
Date & Time Pickers
对话框,Alert Panel
SimpleDialog
AlertDialog
BottomSheet
ExpansionPanel
SnackBar ...
bactching
批处理使用 Dataloader如果你正在使用 graphql,那么你可能遇到数据图查询.这可以通过本地数据图加载轻松实现.使用 java-dataloader 将帮助你更高效的处理数据图条目的缓存和批量请求.如果 dataloader 已经发现了一个之前的数据条目,它将会缓存数据并且直接返回不再发起请求.假设我们需要查询一个英雄和他们朋友的名字及他们朋友的朋友的名字.
12345678910111213{ hero { name { friends { name { friends { name } } } } }}
这个查询的结果如下.
123456789101112131415 ...
scalars
graphql 中的常量scalarsgraphql 类型系统的叶子节点被称为 scalars.一旦到达了 scalar 类型则无法在沿着类型结构继续向下了.scalar 类型是指不可再分割的值.graphql 规范明确要求所有的语言实现必须具有以下 scalar 类型.
String 即 GraphQLString- 一个 UTF-8 字符串序列.
Boolean 即 GraphQLBoolean- true or false.
Int 即 GraphQLInt- 有符号的 32 整型数.
Float 即 GraphQLFloat- 有符号的双精度浮点数.
ID 即 GraphQLID- 类似于 String 的唯一标识符.定义一个 ID 标识符即表示该属性不是人类可识别的用途.graphql-java 为 java 系统添加了以下有用的 scalar 类型.
Long 即 GraphQLLong- 基于 java.lang.Long 的 scalar.
Short 即 GraphQLShort- 基于 java.lang.Short 的 scalar.
Byte ...
data mapping
Mapping datagraphql 是如何把对象数据匹配到类型的graphql 内部全部是关于声明类型 schema,然后在运行匹配到数据.作为类型 schema 的设计者,你应该在处理这些元素.
12345678910type Query { products(match: String): [Product] # a list of products}type Product { id: ID name: String description: String cost: Float tax: Float}
然后可以执行查询
12345678query ProductQuery { products(match: "Paper*") { id name cost tax }}
对于 Query.products属性有一个绑定的 DataFetcher负责查找匹配输入参数的 product s 列表.假设我们有 3 个下游服务.一个获取产品信息 ...
execution
ExecutionQueries对 schema 执行 query,使用合适的参数构建一个新的 GraphQL 对象,然后调用execute().query 的结果是包含查询数据或者(并且)一系列错误的ExecutionResult 对象.
123456GraphQLSchema schema = GraphQLSchema.newSchema().query(queryType).build();GraphQL graphQl = GraphQL.newGraphQL(schema).build();ExecutionInput executionInput = ExecutionInput.newExecutionInput().query("query { hero { name }}");ExectionResult executionResult = graphQl.execute(executionInput);Object data = executionResult.getData();L ...
data fetcher
获取数据graphql 如何获取数据graphql 中的每个属性都关联了一个 graphql.schema.DataFetcher.一些属性会使用专用的 data fetcher 从数据库获取该属性的相关信息.而大多数简单的使用属性名和 Plain Old Java Object(POJO)模式 从内存中获取数据.在其他 graphql 实现中,Data fetcher 被称为 resolver现在声明一个类型定义:
123456789101112type Query { products(match: String): [Product] # a list of products}type Product { id: ID name: String description: String cost: Float tax: Float launchDate(dateFormat: String = "dd,MM,yyyy"): String}