我们每天都在用JSON,但JSON中的一些坑你们都知道吗? 比如, JSON的value值为null时,key会直接没了?...value为Date类型时,JSON.toJSONString打印出来的是时间戳,取出来的却是Date?等。...); // System.out.println("json -- key1str:" + key1str); System.out.println(""); } //打印出来的...json -- key2:null json -- key1str:null 可见, 1.JSONObject的value对以格式date存放的数据,toJSONString时显示为时间戳; 2.如果...value为null时,key将直接被取消,get到null值; 所以我们在开发过程中,往JSONObject中赋值时,一定要先判断该值是否为null,及时处理。
当有大量数据的时候这种方式明显是不科学的,就像ListView.builder一样,用法如下: ListWheelScrollView.useDelegate( itemExtent: 150...调整perspective perspective属性表示圆柱投影透视图,类似OpenGLES中透视投影,理解为看圆柱的距离,为0时表示从无限远处看,1表示从无限近处看,值的范围(0,0.01],注意是左开右闭区间...,例如,如果高度为100px,itemExtent为20px,那么5个项将放在一个等效的平面列表中。...当squeeze为1时,RenderListWheelViewport中也会显示5个子控件。...当squeeze为2时,RenderListWheelViewport中将显示10个子控件,默认值为1,用法如下: ListWheelScrollView( itemExtent: 150
,通过使用ReorderableList来实现的,以及它的各个回调函数 ?...的gameobject时 void OnEnable() { if( target == null ) { return;...buttonRect, ReorderableList l ) => { if( m_Piston.States == null || m_Piston.States.Count...m_LastTime ) * m_PlaybackModifier; // 当预览时间改变时,我们需要确保重绘这个窗口以便我们可以立即看到它的更新 //...添加到默认的control里,这样Unity就会选择我们的控制权而非Unity默认的Scene视图行为 HandleUtility.AddDefaultControl(controlId); }
默认情况下,Flutter会根据具体平台分别使用不同的ScrollPhysics对象,应用不同的显示效果,如当滑动到边界时,继续拖动的话,在iOS上会出现弹性效果,而在Android上会出现微光效果。...默认情况下,Flutter会根据具体平台分别使用不同的ScrollPhysics对象,应用不同的显示效果,如当滑动到边界时,继续拖动的话,在iOS上会出现弹性效果,而在Android上会出现微光效果。...padding:填充距离 itemExtent:强制 listview 的 children 的长度 为 itemExtent 的值。...指定 itemExtent 的值比让子元素决定自身长度在绘制时更高效,特别是在滚动位置频繁变化的状态下,因为设置 itemExtent 可以让滚动系统提前知道列表的长度。...默认情况下,Flutter会根据具体平台分别使用不同的ScrollPhysics对象,应用不同的显示效果,如当滑动到边界时,继续拖动的话,在iOS上会出现弹性效果,而在Android上会出现微光效果。
ListView通用属性值 含义 itemExtent 每个子控件的高度。指定itemExtent的值比不指定(自适应高度)会更高效。...shrinkWrap 是否根据子组件的总高度来设置ListView的高度,默认为false 。当ListView在一个无边界(滚动方向上)的容器中时,shrinkWrap必须为true。...addAutomaticKeepAlives 是否将列表项(子控件)包裹在AutomaticKeepAlive组件中,包含之后列表项滑出视口时它也不会被GC。...当列表滚动到具体的index位置时,会调用该构建器构建列表项。 itemCount 列表项的数量,如果为null,则为无限列表。...ListView.custom可以自定义ListView的Item,对于复杂ListView(比如不同index对应不同布局时)需要用到它。
前言 当组件内容超过当前显示视口(ViewPort)时,如果没有特殊处理,Flutter则会提示Overflow错误。...,本章第一节中已经介绍过,不再赘述;第二组是ListView各个构造函数(ListView有多个构造函数)的共同参数,我们重点来看看这些参数,: itemExtent:该参数如果不为null,则会强制children...当ListView在一个无边界(滚动方向上)的容器中时,shrinkWrap必须为true。...当可滚动组件滚动时,将列表项包裹在RepaintBoundary中可以避免列表项重绘,但是当列表项重绘的开销非常小(如一个颜色块,或者一个较短的文本)时,不添加RepaintBoundary反而会更高效...当列表滚动到具体的index位置时,会调用该构建器构建列表项。 itemCount:列表项的数量,如果为null,则为无限列表。
bool primary,//是否是与父级关联的主滚动视图 this.physics,//设置滚动效果 this.controller,//控制滚动位置,当primary为true时,controller...必须为null this.child,//列表项内容 this.dragStrartBehavior = DragStrartBehavior.down,//处理拖拽开始行为的方式 }) 示例代码...,默认false,即从头开始滚动 ScrollController controller,//控制滚动位置,当primary为true时,controller必须为null bool primary...= true,//是否保持滚动位置 this.debugLabel, }) 当keepScrollOffset的属性值为true时,可滚动组件的滚动位置会被存储到PageStorage中,当可滚动组件重新创建时可以使用...,//处理拖拽开始行为的方式,默认为检测到拖拽手势时开始执行滚动拖拽行为 }) 2)PageView.builder():创建一个滚动列表,适合子组件比较多的场景,需要指定子组件的数量; 3)PageView.custom
上面的三个属性是必须给出的。 其中 itemExtent 是最简单的,代表 主轴方向 item 尺寸。...如下轮子上下滑滚动 ,主轴就是 Y 轴,itemExtent 就表示每个 item 的高度。 ?...不过凭借着之前的经验知道,这个对象可以通过 Scrollable 中获得。在 viewportBuilder 属性赋值时,可以回调 ViewportOffset 对象。...属性的作用 itemExtent = 80 itemExtent = 100 ?...如下,在上面的小圆颜色有下面滚轮滑动时选中色决定。ListWheelViewport 的相关属性,在 ListWheelScrollView 中效果是一致的。 ?
那么,当这些基本元素的排列布局超过屏幕显示尺寸(即超过一屏)时,我们就需要引入列表控件来展示视图的完整内容,并根据元素的多少进行自适应滚动展示。...当列表滚动到相应位置时,ListView会调用该方法创建对应的子Widget。 itemCount,表示列表项的数量,如果为空,则表示ListView为无限列表。...,itemExtent并不是一个必填参数。...因为如果这个参数为null,ListView会动态地根据子Widget创建完成的结果,决定自身的视图高度,以及子Widget在ListView中的相对位置。...为了节省性能,对于定高的列表项视图,提前指定itemExtent比让子Widget自己决定要更高效。
可滚动组件 当组件内容超过当前显示视口(ViewPort)时,如果没有特殊处理,Flutter 就会提示 Overflow 错误,为此,Flutter 提供了多种可滚动组件,用于显示列表和长布局; 可滚动组件都直接或间接的包含一个..., 当滑动方向为垂直方向 (ScrollDirection 值为 Axis.vertical ) 并且没有指定 controller 时,primary 默认为 true。...,上面已经说过了;第二组是 ListView 各个构造函数( ListView 有多个构造函数) 的共同参数,我们需要重点看看这些参数: itemExtent:该参数如果不为 null,则会强制 children...当列表滚动到具体的 index 位置时,会调用该构建起构建列表项。...方法生成单词;当列表滑动到末尾时,判断是否有下一页,如果有则进行异步获取,并显示 loading,没有则显示没有更多了。
重建最小化原则 在调用 setState() 方法重建组件时,一定要最小化重建组件,没有变化的组件不要重建,看下面的Demo,这是一个设置页面, import 'package:flutter/material.dart...: 不可见时的组件树: 两种状态组件树结构发生变化,应该避免发生此种情况,优化如下: Center( child: Column( children: [ Visibility(...RaisedButton(onPressed: null) : Text('不显示'), Container(), ], ), ); } 设置为 true 时的组件树结构...: 设置为 false 时的组件树结构: 看到左侧子节点由 RaisedButton 变为了 Text。...这是因为不设置 itemExtent 属性,将会由子组件自己决定大小,大量的计算导致UI堵塞。
); Action用于用户触发的一种行为 Reducer用于根据Action产生新的Stateflutter redux流程1.Widget通过StoreConnector绑定Store中的State数据...2.Widget通过Action触发一种新的行为 3.Reducer根据收到的Action更新State 4.更新Store中的State绑定的Widget 根据以上流程,我们实现项目中的主题切换功能...AppState( themeData: themeReducer(state.themeData, action), ); } 而themeReducer将ThemeData和所有跟切换主题的行为绑定在一起...与TypedReducer将RefreshThemeDataAction和_refresh绑定在一起,当用户每次发出RefreshThemeDataAction时,都会触发_refresh,用来更新themeData...= null && primary != null && threshold !
)), 如果每个 item 的高度可以确定,那么推荐通过 itemExtent 来设置 item 的高度/宽度,能够加快 ListView 的渲染速度。...以上代码查看 listview_main.dart 文件 总结下:如果 item 的高度能够准确获取,一定要指定 itemExtent 的值,这样会更加高效,至于要通过哪种方式来生成,完全看个人喜好吧。...例如我们需要实现,当滚动的距离大于一定距离的时候显示一个回到顶部的按钮,有了 ScrollController 就能够非常方便的实现 ScrollController 因为需要根据滑动的距离显示回到顶部按钮...Alignment.center, child: Text('Item ${index + 1}'))), ), floatingActionButton: _showBackTop // 当需要显示的时候展示按钮...,不需要的时候隐藏,设置 null ?
SliverAppBar控件可以实现页面头部区域展开、折叠的效果,类似于Android中的CollapsingToolbarLayout。 先看下SliverAppBar实现的效果,效果图如下: ?...floating 设置为true时,向下滑动时,即使当前CustomScrollView不在顶部,SliverAppBar也会跟着一起向下出现 pinned 设置为true时,当SliverAppBar...内容滑出屏幕时,将始终渲染一个固定在顶部的收起状态 snap 设置为true时,当手指放开时,SliverAppBar会根据当前的位置进行调整,始终保持展开或收起的状态,此效果在floating=true...时生效 实现文章开头效果的整体代码如下: class SliverAppBarDemo extends StatelessWidget { @override Widget build(BuildContext...: BoxFit.fitHeight, ), ), ), SliverFixedExtentList( itemExtent
( itemCount: todo.length, padding: EdgeInsets.all(8.0), itemExtent: 50.0, itemBuilder...:鸟瞰全局 这里状态有点乱,我画了幅图说明一下: 状态量有三个:text 输入框的文字,todo列表数据,showType展现类型 1.输入框通过监听,改变text的值 2.在添加按钮点击时,将加入到状态值...6.在适宜的状态值改变时,调用老夫的setState来更新 ---- 2.2:输入框监听 onChanged: (str) { text = str; }, ---- 2.3:点击按钮监听 注意收起键盘的操作...= null && text !...= null && text !
( itemCount: todo.length, padding: EdgeInsets.all(8.0), itemExtent: 50.0, itemBuilder...这里状态有点乱,我画了幅图说明一下: 状态量有三个:text 输入框的文字,todo列表数据,showType展现类型 1.输入框通过监听,改变text的值 2.在添加按钮点击时,将加入到状态值...6.在适宜的状态值改变时,调用老夫的setState来更新 2.2:输入框监听 onChanged: (str) { text = str; }, 2.3:点击按钮监听 注意收起键盘的操作FocusScope.of...= null && text !...= null && text !
: todo.length, padding: EdgeInsets.all(8.0), itemExtent: 50.0, itemBuilder: (BuildContext...状态量有三个:text 输入框的文字,todo列表数据,showType展现类型 1.输入框通过监听,改变text的值 2.在添加按钮点击时,将加入到状态值todo中 3.todo用来渲染Todo列表...6.在适宜的状态值改变时,调用老夫的setState来更新 ---- 2.2:输入框监听 onChanged: (str) { text = str; }, ---- 2.3:点击按钮监听 注意收起键盘的操作...= null && text !...= null && text !
ListView时所产生的效果。...当列表滚动到具体的index位置时,会调用该构建器构建列表项。 itemCount:列表项的数量,如果为null,则为无限列表。...当子Widget即将被展示到屏幕中时,itemBuilder函数才会被调用。...出现在手机屏幕时才进行加载的目的。...3.2 Flutter 中常用的 Sliver Sliver名称 功能 对应的可滚动组件 SliverList 列表 ListView SliverFixedExtentList 高度固定的列表 指定itemExtent
Slivers, ListView.builder({ //...... }) : assert(itemCount == null || itemCount >= 0), assert(...semanticChildCount == null || semanticChildCount <= itemCount!)...( itemExtent: 100, delegate: SliverChildListDelegate( [ FlutterLogo(),...color: Colors.red), child: CustomScrollView( slivers: [ SliverFixedExtentList( itemExtent...,SliverAppbar 为应用栏提供了自定义滚动行为,下面我们来看一下 class _MyHomePageState extends State { @override
领取专属 10元无门槛券
手把手带您无忧上云