print('非具体类型: $e'); } } 异常三部曲: throw 抛出异常 + catch 捕获异常 + finally 就是要执行 11 泛型 如果你在API文档寻找基本数组类型或者...(dot)来调用实例的变量或者方法。 使用 ?. 来确认前操作数不为空, 常用来替代. , 避免左边操作数为 null 引发异常。 使用 runtimeType 方法,在运行中获取对象的类型。...该方法将返回 Type` 类型的 12.2 实例化变量(Instance variables) 在类定义中,所有没有初始化的变量都会被初始化为null。...声明一个枚举类型需要使用关键字 enum : enum LGColor { red, green, blue } 在枚举中每个值都有一个 index getter 方法,它返回一个在枚举声明中从.../ 在枚举中每个值都有一个 index getter 方法,它返回一个在枚举声明中从 0 开始的位置。
App 异常的捕获方式 App 异常,就是应用代码的异常,通常由未处理应用层其他模块所抛出的异常引起。...应用中的未处理异常,可以把 main 函数中的 runApp 语句也放置在 Zone 中。...这样在检测到代码中运行异常时,我们就能根据获取到的异常上下文信息,进行统一处理了: runZonedNull>>(() async { runApp(MyApp()); }, onError...Flutter 框架异常捕获 Flutter 框架为我们在很多关键的方法进行了异常捕获。...= null) onError(details); //调用了onError回调 } 我们发现 onError 是 FlutterError 的一个静态属性,它有一个默认的处理方法dumpErrorToConsole
哔哩哔哩漫画APP实践Flutter 也有大半年时间了,我针对线上收集到的错误进行分析,挑选出了一些有一般代表性的错误,列在本文,可供实践 Flutter 的初学者们作为一点参考。...典型错误一:无法掌握的Future 典型错误信息:NoSuchMethodError: The method 'markNeedsBuild' was called on null....典型错误二:Navigator.of(context) 是个 null 典型错误信息:NoSuchMethodError: The method 'pop' was called on null....NoSuchMethodError: The method '+' was called on null....NoSuchMethodError: The method '*' was called on null. 示例代码 这种错误,较常发生在使用服务端返回的数据model时。
2.表单 2.1.介绍 在Flutter中,表单(Form)是一个用于数据收集和验证的容器组件。它通常与 TextField 和 FormField 等输入组件结合使用,以创建一个完整的用户输入表单。..._formKey 3.1.介绍 _formKey 在 Flutter 中通常是作为一个 GlobalKey 实例来使用,主要用于管理 Form 组件。...它提供了对表单的控制,使得开发者可以在表单外部执行一些操作,如验证表单、保存表单数据、重置表单等。 3.2...._formKey 的主要用法 验证表单(Validating the Form):通过 _formKey.currentState.validate() 可以触发表单中每个 FormField 的验证逻辑...重置表单(Resetting the Form):使用 _formKey.currentState.reset() 可以重置表单到初始状态,清除所有 FormField 的内容。
本篇主要描述的Flutter的打包、在开发过程中遇到的各类问题与细节,算是对上两篇的补全。 友情提示:本文所有代码均在 GSYGithubAppFlutter ,要不试试?(◐‿◑)。...但由于笔者项目中使用了第三方的插件包如 shared_preferences 等,在执行 Archive 的过程却一直出现如下问题: 在 `Archive` 时提示找不到 #import 在 IOS 执行 Archive 之前,需要执行 flutter build release,如下图在命令执行之后,Pod 的执行目录会发现改变,并且生成打包需要的文件。...同时如果希望直接在真机上调试 Flutter,可以参考 :《Flutter基础—开发环境与入门》 下的 IOS 真机部分。...所以只要你的控件实现了 preferredSize,就可以放到 AppBar 的 bottom 中使用。比如下图搜索栏,这是TabView下的页面又实用了AppBar。
的 apk 会比 ipa 更小一些,这其中的一部分原因是 Flutter 使用的 Skia 在Android 上是自带的。...但由于笔者项目中使用了第三方的插件包如 shared_preferences 等,在执行 Archive 的过程却一直出现如下问题: 在 `Archive` 时提示找不到 #import 在 IOS 执行 Archive 之前,需要执行 flutter build release,如下图在命令执行之后,Pod 的执行目录会发现改变,并且生成打包需要的文件。...同时如果希望直接在真机上调试 Flutter,可以参考 :《Flutter基础—开发环境与入门》 下的 IOS 真机部分。...所以只要你的控件实现了 preferredSize,就可以放到 AppBar 的 bottom 中使用。比如下图搜索栏,这是TabView下的页面又实用了AppBar。 ?
函数在收到消息后把消息包嵌入新构建的Event然后在processEvent里通过stateName取出相应的StateFunction后传入Event产生新的状态State。...= null) makeTransition(currentState) else throw new IllegalStateException("You must call `startWith...stay using si.copy(talks = numtalks) } whenUnhandled { //所有状态未处理的Event case Event(NextMonth,...FSM状态数据用不可变对象(immutable object)最安全,所以在更新时必须用case class 的copy或直接构建新的SeasonInfo实例。...this.nextState = null } currentState = nextState def scheduleTimeout(d: FiniteDuration
在Flutter开发中,根据异常来源的不同,可以将异常分为Framework异常和Dart异常。...因此,要实现自定义捕获异常逻辑,只需要为它提供一个自定义的错误处理回调函数即可。 异常捕获 在Flutter开发中,根据异常来源的不同,可以将异常分为Framework异常和Dart异常。...同时,如果需要集中捕获Flutter应用中未处理的异常,那么可以把main函数中的runApp语句也放置在Zone中,这样就可以在检测到代码运行异常时对捕获的异常信息进行统一处理,如下所示。...目前为止,我们已经对应用中出现的所有未处理异常进行了捕获,不过这些异常还只能被保存在移动设备中,如果想要将这些异常上报到服务器还需要做很多的工作。...这两步对应着在 Dart 层需要封装的 2 个原生接口调用,即 setup 和 postException,它们都是在方法通道上调用原生代码宿主提供的方法。
; } /** * 批准后的状态 */ public static State getApprovedState(State currentState) {...T state; private StateNode approveNode; private StateNode rejectNode; } 这样构造好链表以后,还需在工具类中要构造...null: return node.getRejectNode().getState(); } } 整体比较曲折,不如直接将赞同和拒绝定义在 State 枚举内更直观。...(currentState); if(next == null){ throw new IllegalStateException("当前已经终态");...(State currentState) { State next = REJECT.getNextState(currentState); if(next == null
事情是这样的,由于近期 Flutter 发布了 1.17 的稳定版,按照“惯例”开始着手把生产项目升级到 1.12.13+hotfix.9 版本,在升级适配完成之后,一个突如其来的 Bug 让我陷入了沉思...其实 Window 的值来源于 Flutter Engine,在键盘弹出时 Flutter Engine 会通过 _updateWindowMetrics 方法更新 Window 数据,并执行 window.onMetricsChanged...这时候我突然想起,之前为了锁定页面的字体大小不跟随系统缩放,我在路由层使用了 MediaQueryData.fromWindow 复制一份 MediaQuery,问题很可能出在这里: Navigator.of...= null) _scopeKey.currentState....MaterialApp 的更新,导致了 PageRoute 重新 builder, 使得没有键盘的 Scaffold 使用了弹出键盘的 viewInsets.bottom。
= null): Job = JobImpl(parent) 这个很好理解,当传入parent时,此时的Job将会作为parent的子Job。...默认情况下,如果内部的子Job发生异常,那么它对应的parent Job与它相关连的其它子Job都将取消运行。俗称连锁反应。...-> Unit 这个cause有三种情况分别为: is null: 协程正常执行完毕 is CancellationException: 协程正常取消,并非异常导致的取消 Otherwise: 协程发生异常...使用Kotlin语言进行开发,项目架构是基于Jetpack&DataBinding的MVVM;项目中使用了Arouter、Retrofit、Coroutine、Glide、Dagger与Hilt等流行开源技术...flutter_github: https://github.com/idisfkj/flutter_github 基于Flutter的跨平台版本Github客户端,与AwesomeGithub相对应。
调用方法时,使用点(.)来引用实例变量或方法,可以在对象上调用它:可以访问该对象的函数和数据。...而不是.避免异常: // 如果p为非null,则将其y值设置为4. // p?....assert(point.y == null); // Values default to null. } 如果初始化声明它的实例变量(而不是构造函数或方法),则在创建实例时设置该值,该实例在构造函数及其初始化列表执行之前...函数的返回值可以是void,也可以是null,也可以是具体对象。如果没有指定返回值,则该函数返回的是null。...index getter,它返回枚举声明中值的从零开始的位置。
在定义了扩展方法之后,我们就可以在 String 上调用新的 parseInt 方法,就如同这个方法是在 String 类中被原生定义的那样: extension ParseNumbers on String...如下所示,该调用在运行时会抛出异常: dynamic d = '2'; d.parseInt(); → Runtime exception: NoSuchMethodError 扩展方法和 Dart...不过在 Dart 中,这个功能更加宽泛: 它还支持使用新的 getter、setter 以及运算符来扩展类。在上面那个 FancyList 的例子中,evenElements 就是一个 getter。...describe 方法时崩溃,并抛出一个空指针异常。...= null) {...}
1.定义消息 在开始建立webSocket之前,我们需要定义消息,如:发送人,发送时间,发送人id等.....定义接口 这里我们定义两个接口,一个用于连接的接口,一个用于发送消息的接口 /mini/login 提交用户的信息,如果不正确,返回相关的信息,不给连接 /min/connect 连接websocket...,下面,我们使用Flutter简单的编辑一下客户端平台 4.Flutter建立一个简单的聊天室 这部分代码为Flutter下,可简单的编辑一个聊天室 mport 'package:flutter/...cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; void...currentState ?.
中所有的基础类型、类等都继承 Object ,默认值是 NULL, 自带 getter 和 setter ,而如果是 final 或者 const 的话,那么它只有一个 getter 方法,Object...+ indicatorWeight); } 13、Assert(断言) assert 只在检查模式有效,在开发过程中,assert(unicorn == null); 只有条件为真才正常,否则直接抛出异常...Zone Dart 中可通过 Zone 表示指定代码执行的环境,类似一个沙盒概念,在 Flutter 中 C++ 运行 Dart 也是在 _runMainZoned 内执行 runZoned 方法启动...Flutter 中 setState 其实是调用了 markNeedsBuild ,该方法内部标记此Element 为 Dirty ,然后在下一帧 WidgetsBinding.drawFrame...PlatformView Flutter 中通过 PlatformView 可以嵌套原生 View 到 Flutter UI 中,这里面其实是使用了 Presentation + VirtualDisplay
Dart中的空安全 Null Safety 的引入是 Dart 语言的一个重要里程碑。Null Safety 通过「在开发期间而不是在运行时捕获 null 错误来」帮助您避免一整类问题。...❝Null Safety 可作为 Flutter 2.0 的稳定版本使用,并且默认为所有使用 Flutter 2.2 创建的项目启用。 ❞ Dart的类型系统 Dart 有一个「健全的类型系统」。...所以下面的代码编译正常,但「在运行时」生成异常: square(null); // Unhandled Exception: NoSuchMethodError: The method '*' was...; // NoSuchMethodError: 'Null Value>' print(null!)...; // NoSuchMethodError: 'Null Value>' 所以,当断言错误时,! 将引发运行时异常。 有时我们需要使用返回可空值的函数: String?
导语 接到了一个仿电影院的需求,上周几乎是找遍了百度,谷歌,stackoverflow。均没有找到用flutter实现的效果,那只能自己写一个了。本文只讲思路,具体实现还需各位看官自己动手。...= null) { controller.fromInteractiveViewKey.currentState.onScaleUpdate(details); } } _...= null) { controller.fromInteractiveViewKey.currentState.onScaleStart(details); } } _onInteractionEnd...= null) { controller.fromInteractiveViewKey.currentState.onScaleEnd(details); } } 完全无需任何加工...这里讲一个UI适配的注意事项: 由于笔者项目用了ScreenUtil(UI自适应),所以在竖屏的时候,传入竖屏的UI尺寸图,且尺寸结尾使用.w进行适配,当横屏时,传入横屏的UI尺寸图(其实就是将竖屏的width
在Flutter世界中,Key分为两种类型,一种是GlobalKey,一种LocalKey,LocalKey具体到实现的类型又有ObjectKey, UniqueKey,ValueKey等等… 本文我们将讨论的是...myColor}"); }); } } 在运行上面程序之后可以看到打印了色块widget随机生成的颜色,即通过key.currentState可以获取到state数据,同样的可以通过currentContext...get currentState { final Element?...; } } 对Flutter三棵树挂载流程熟悉的同学应该知道,element通过inflateWidget->mount-> rebuild(ComponentElement) -> performRebuild...答案是会的,但是build方法调用不代表我们的widget被重新绘制,在Flutter中build方法是生成widget配置信息的,是很轻量也是会被频繁调用。
Flutter里面的ScrollView及其子view都可以添加下拉刷新功能,只要在view的上层再包裹一层RefreshIndicator,这个下拉刷新是MD风格的。...方法是接受一个FutureNull>的参数 通过代码触发下拉 _refreshIndicatorKey.currentState.show(); 声明一个key来保存控件 final GlobalKey...> 的回调 child: new ListView.builder( // 这句是在list里面的内容不足一屏时,list可能会滑不动,加上就一直都可以滑动...> _getData() { final CompleterNull> completer = new CompleterNull>(); // 启动一下 [Timer] 在3秒后...}); return completer.future; } 关于学习 flutter的学习文章都整理在这个github仓库里
= null){ return ApiException(apiResponse.code, apiResponse.message); } 是因为有些时候后端业务异常时修改了返回的 http 状态码...,在 catch 中进行统一异常处理,当外部未处理异常时则在 handleException 中进行统一处理,如 401 则跳转登录页,其他错误统一弹出错误提示。...前面解决异常处理使用了一个全局的 request 方法,loading 可以使用同样的思路实现,创建 loading 方法: Future loading( Function block, {bool...同时对 block 包裹 try-catch 保证在异常时取消 loading,并且在 catch 中不做任何处理直接抛出异常。..."登录失败"}"); 这句输出并没有执行,当 onError 返回 false 时依然会弹出错误的提示,是因为返回 false 时调用了默认的异常处理弹出提示,返回 true 时则不会调用默认的异常处理方法