其中itemExtent是一个double类型的数据,如果给定的是一个非空值,那么表示的是child在scroll方向的extent大小。...,因为itemExtent本身就是一个固定值,所以返回的是SliverFixedExtentList。...如果itemExtent没有设置,并且prototypeItem有值的话,返回的是一个SliverPrototypeExtentList。...最后,如果itemExtent和prototypeItem都没有设置的话,返回的是一个SliverList对象。...index ~/ 2 : null; }, ),可以看到,如果index是even的话就会使用itemBuilder生成一个widget,如果index是odd的话,就会使用
不慌,Flutter 也为我们提供了相关的 Widget。 Draggable Flutter 如果要实现这种效果,那么非 Draggable 不可。 照例我们查看官方文档。...那也就是说,除了 Draggable ,还有一个 DragTarget。 DragTarget 是用来接收我们拖过去的 Widget 的,我们后面再说。 先说Draggable。...: (context, index) { return Draggable( // 返回一个Draggable // 必须要一个Material,不然拖动时Text会有双下划线...其他参数看名字也都能明白: onWillAccept 拖到该控件上时调用 onAccept 放到该控件时调用 onLeave 没有放到该控件时调用 那我们这里只需要一个确认已经放到该控件时的回调,来接收我们传过来的值...key); } 因为如果想要传入数据,那也就必须要有数据可以传,也就是我们构造函数里看到的 data 字段。
如果存在,那么直接返回 outgoingItem.removedItemBuilder,这个 itemBuilder 是需要我们自己写的。...因为我们插入的 widget 肯定也是原有的widget,所以在写AnimatedList 时就已经写好了。 接下来就是判断添加的动画是否存在。...所以我们了解到,如果我们在定义 itemWidget 的时候,如果不给动画的插值器,那么动画就会是一个 kAlwaysCompleteAnimation。...最后把这个widget 返回就完成了这一个 itemBuilder。...总结 所以,综上所述,我们在定义一个 AnimatedList 时必须传入一个带动画的 Widget,不然我们用这个控件的意义何在? 关注我,每天更新 Flutter & Dart 知识。
各个构造函数(ListView有多个构造函数)的共同参数,我们重点来看看这些参数,: itemExtent:该参数如果不为null,则会强制children的“长度”为itemExtent的值;这里的“...当ListView在一个无边界(滚动方向上)的容器中时,shrinkWrap必须为true。...@required IndexedWidgetBuilder itemBuilder, int itemCount, ... }) itemBuilder:它是列表项的构建器,类型为IndexedWidgetBuilder...,返回值为一个widget。...在itemBuilder中,如果显示到最后一个时,判断是否需要继续获取数据,然后返回一个Icon。
child; HeightReporter({this.child}); @override Widget build(BuildContext context) { // 手势识别组件包裹一个...null; @override Widget buildPage(BuildContext context, Animation animation, Animation...context,用来获取点击的控件的位置, OnItem就是我们的自定义类型声明回调,传了个String类型的值回去给上级接收,这个String类型的值就是赞或评论: // 类型声明回调 typedef...= null) { Navigator.of(context).pop(); widget.onClick(item); // 事件返回String类型的值...= null) { Navigator.of(context).pop(); widget.onClick(item); // 事件返回String类型的值
当ListView在一个无边界(滚动方向上)的容器中时,shrinkWrap必须为true。...默认构造函数有一个children参数,它接受一个Widget列表。...@required IndexedWidgetBuilder itemBuilder, int itemCount, ... }) ListView.builder属性值 含义 itemBuilder...它是列表项的构建器,类型为IndexedWidgetBuilder,返回值为一个widget。...该实例可以获取到ListView的index,并根据index返回对应的Widget。适用于高度自定义ListView的情况下使用。
可滚动组件 当组件内容超过当前显示视口(ViewPort)时,如果没有特殊处理,Flutter 就会提示 Overflow 错误,为此,Flutter 提供了多种可滚动组件,用于显示列表和长布局; 可滚动组件都直接或间接的包含一个...@required IndexedWidgetBuilder itemBuilder, int itemCount, ... }) 复制代码 itemBuilder:列表的构建器,类型为 IndexedWidgetBuilder...,返回值为一个 widget。....map((e) => e.asPascalCase) .toList()); }) }); } 复制代码 onRefresh 接收一个返回值为...Future 的函数, 其中 async 表示这个函数是一部分,使用该关键字的函数必须返回一个 Future 对象 await 后面必须是一个 Fluture ,表示等等等异步执行完成,执行完成之后才会继续往下执行
,返回值为一个widget。...上面提及的部分组件是和可滚动组件无关的,它们主要是为了结合CustomScrollView一起使用,这是因为CustomScrollView的子组件必须都是Sliver。...中获取,而是必须通过对应的Widget的Controller来实现。...NotificationListener是一个Widget,模板参数T是想监听的通知类型,如果省略,则所有类型通知都会被监听,如果指定特定类型,则只有该类型的通知会被监听。...该回调可以返回一个布尔值,代表是否阻止该事件继续向上冒泡,如果为true时,则冒泡终止,事件停止向上传播,如果不返回或者返回值为false 时,则冒泡继续。
, // 可以是 null ) 就如 ListView.builder 那样,也是根据需求构建子挂件。...如果 itemCount 被设置为 null(或者不设计),页面的列表会被无限生成。...注意:controller.currentPage 返回一个 double 值。比如,当滑动页面时,该值逐渐从 1 变为 2,并且不会立即跳到 2。...Transform 1 设置 首先,我们使用一个基本的 PageView.builder: PageView.builder( controller: controller, itemBuilder...在这个例子中,我们在 X 方向旋转页面,因为它通过 currentPageValue 减去 index 的弧度值进行滑动。我们可以通过乘于这个值放大这种效果。
FutureBuilder组件类 FutureBuilder是一个具有泛型T的类,T代表异步的数据类型,这里也就是List FutureBuilder是一个StatefulWidget.... initialData:T 类型----初始数据 class FutureBuilder extends StatefulWidget { /// Creates a widget...FutureBuilder的核心逻辑 _snapshot初始化完成,然后执行_subscribe()这是FutureBuilder的灵魂 如果widget.future非空,会创建callbackIdentity...比如现在是ConnectionState.waiting,就可以返回loading组件 Widget _builderList( BuildContext context, AsyncSnapshot...当发生异常snapshot.hasError会为true,这样可以构建错误界面 Widget _builderList( BuildContext context, AsyncSnapshot
接收滚动事件的参数类型为ScrollNotification,它提供了一个metrics属性,该属性包含了当前可视窗口和滚动位置等信息。...如果为null,则列表为无限列表。...oldDelegate) { return true;//是否需要执行重绘 } } 示例效果: 创建Flutter自绘组件时,可以做以下两点性能优化: 1)尽可能利用好shouldRepaint()的返回值...如果绘制的内容不需要依赖外部状态,返回false即可;如果绘制过程需要依赖外部状态,可以在shouldRepaint()中判断依赖的状态是否改变,如果已改变,则返回true并执行重绘操作,反之则返回false...不执行重绘; 2)绘制应尽可能多地进行分层 因为复杂的自绘组件都是由很多功能构成的,如果都写在一个方法中,不利于阅读,而且全部重绘带来的性能开销也很大。
点击 AppBar 右上角的按钮,弹出一个菜单供用户选择。 幸运的是,Flutter 提供给我们了一个 Widget,直接就能实现如上的效果。...大致意思为: 当按下的时候显示一个菜单,选择了一个项目的时候会回调 onSelected,传递的值是所选菜单的值。 可以提供 child or icon ,但是不能同时提供。...= null),assert(offset != null),assert(enabled != null),assert(!(child != null && icon !...= null)), // fails if passed both parameterssuper(key: key); 这里面每一个参数应该都很好理解,就不做过多的解释了, 唯一必传的参数就是 itemBuilder...2.然后在 AppBar 的「actions」里定义了 PopupMenuButton3.设置 icon 为 Icon(Icons.more_vert)4.itemBuilder 需返回一个 List<
FutureBuilder组件类 FutureBuilder是一个具有泛型T的类,T代表异步的数据类型,这里也就是List FutureBuilder是一个StatefulWidget...initialData:T 类型----初始数据 class FutureBuilder extends StatefulWidget { /// Creates a widget that...FutureBuilder的核心逻辑 _snapshot初始化完成,然后执行_subscribe()这是FutureBuilder的灵魂 如果widget.future非空,会创建callbackIdentity...比如现在是ConnectionState.waiting,就可以返回loading组件 Widget _builderList( BuildContext context, AsyncSnapshot...当发生异常snapshot.hasError会为true,这样可以构建错误界面 Widget _builderList( BuildContext context, AsyncSnapshot<
我们需要关注的是gridDelegate参数,类型是SliverGridDelegate,它的作用是控制GridView子组件如何排列(layout)。...SliverGridDelegate是一个抽象类,定义了GridView Layout相关接口。...因此,可以通过控制mainAxisSpacing的值来动态控制网格布局的列数。...4、GridView.extent GridView.extent是SliverGridDelegateWithMaxCrossAxisExtent的另一种代码表现形式(大概是因为名字太长了),它们具有相同的功能...GridView.builder(gridDelegate: null, itemBuilder: null), gridDelegate参数在上面已经讲过了,我们主要来看看itemBuilder如何使用
String Function(String) 是 一个函数「类型」 ,带有 String 参数 并且返回 String类型。...因为超过了一个key-value,所以需要使用 spread 操作符 (...)。 7. 如何以 null-safe的方法遍历整个map?...milk')); 我们可以用Future.value一个值来表示成功完成,或者Future.error表示错误。...使用 Stream.value 从一个单一值创建。 使用 Stream.empty 创建一个空的stream。 使用 Stream.error 包含错误值的stram。...这些值将在函数完成时作为一个 Iterable 返回. ---- 另外, 一个「asynchronous」 generator 需要使用 Stream作为返回值 Stream countStream
settings.arguments 获取传递参数 三、返回值获取 1️⃣ 返回上一页并传值 ElevatedButton( onPressed: () { Navigator.pop(context..., '我是返回值'); }, child: Text('返回上一页'), ) 2️⃣ 接收返回值 void _openDetail() async { final result = await...: $result'); } await → 等待页面返回结果 → 接收返回值 四、完整示例:列表跳转 + 参数传递 + 返回值 class HomePage extends StatelessWidget...五、常见坑 ❌ 没配置 routes → pushNamed 找不到路由 ❌ arguments 类型转换错误 → as Map / List / 自定义类型 ❌ 返回值未 await → 无法获取结果...❌ 命名重复 → 路由冲突 建议: 使用统一命名路由表 参数类型明确 异步 await 获取返回值 大型项目可封装路由管理类 六、本篇你真正掌握了什么?
整体效果 Gif 图: 下面,我们按照步骤来在 ListView 挂件中使用 JSON 文件: 第 1 步:创建一个 Flutter 项目 import 'package:flutter/material.dart...import 'dart:convert'; 然后声明类型为 List 的变量。...builder:此参数接收来自 feature 的数据并返回给小挂件。可以在此处对接接收到的数据并执行任何操作。...initialData:可选的参数,如果我们设置 initialData 参数的值,builder 将会在 future 返回数据前展示 initialData。...future 参数接收到函数返回来的数据之后,将数据传递给 futureBuilder 参数。 builder 解析字符串并返回生成的 Json 对象。
async关键字; // 需要接收数据,需要加 await关键字; // 需要准备一个数据类型变量,来承载; // 指定函数返回类型为String,Alt+enter 改成 Future返回的数据 // 利用Future变量类型的 then方法,拿到返回的数据 // value位置是一个形参,名字可以随便起,这个形参位置就是返回的数据...路由常见问题及其解决方案 主题风格的一致性 主页面和非主页面的 跳转方式选择 可能不太一样; Scaffold组件的body属性值 为 具体组件名称, 接收不到 路由返回(或传递过来)的数据; 目标页面...处理路由返回的数据 // 接收数据是异步的,需要加 async关键字; // 需要接收数据,需要加 await关键字; // 需要准备一个数据类型变量,来承载; // 指定函数返回类型为...处理路由返回的数据 // 利用Future变量类型的 then方法,拿到返回的数据 // value位置是一个形参,名字可以随便起,这个形参位置就是返回的数据
2.WillPopScope拦截、监听返回事件 初始化方法,其中onWillPop参数类型是一个Future的方法....= null), super(key: key); final Widget child; final WillPopCallback onWillPop; typedef...()=>{ _hold = false }) }, onTapCancel: ()=>{setState(()=>{ _hold = false }) }, //使用时必须传一个...widget。...返回值为Future onRefresh: dataInit, child: ListView.builder( controller: _scrollV,
context).pop(); }, ), ); } } 正常情况下是不会有什么问题,但是当用户在点击了 FloatingActionButton 之后,又马上点击了 AppBar 返回退出应用...,这时候就会出现以下的错误提示。...可以看到此时 log 说,Widget 对应的 Element 已经不在了,因为在 Navigator.of(context) 被调用时,context 对应的 Element 已经随着我们的退出销毁...= null; 。 那么到这里我们收获了一个小技巧:使用 BuildContext 时,在必须时我们需要通过 mounted 来保证它的有效性。...initState 和 dispose ,是不允许执行 of(context) 操作。