炸弹框队列是客户端中相对常见的功能组件。它用于统一管理应用程序中的所有隐藏炸弹框架。“颜色的销售””
在所有场景中,将“真实 - 时炸弹框”转换为相应的“炸弹盒请求”,并以序列弹出,然后一个一个弹出。目前,子弹架消失后,它唤起了排队的下一个炸弹框架。
            
具体来说:
没有意识到实施该过程的计划的学生可以直接使用pub.dev:dialog_queue
步骤1-标题元素dialogelement
步骤2:将Dialogelement添加到列中
在谈论特定实现之前,我们必须知道“投注框架dialogqueue.ADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDA”的动作用于替换每个场景中的另一个动作:“ Instant Bomb框架框架showdialog”,通过showdialogfter Switching adddialog switching,adddialog odddialog,adddialog odddialog,adddialog odddialog,adddialog odddialog,它应该原则上是一致的,并且不会打破原始使用机制。
让我们以Flutter的官方Showmodalbottomsheet底部项目符号框架为例。从通常的角度来看,商务电话可以根据以下方式直接弹出一个官方的底部对话框:
从showmodalbottomsheet的源代码来看,此方法实际上是导航器的推动操作。由于它是推送页面操作,这意味着作为异步操作,它将返回将来的对象:
呼叫聚会可能会做两件事:两件事:
因此,总而言之,在将Showdialog切换到Addialog之后,对于呼叫者,其原始习惯应保持不变。也就是说,AddDialog方法结构应像这样:
那么此XXXFUTURE从何而来?回头看对话的定义,我们自然会认为执行结果的执行结果是执行结果的执行结果的执行结果,“ typedef onshow onshow = future fufure”方法的执行结果”扩展子类的返回为xxxfuture,即::
但可惜这不是正确的方法。这只能在调用呼叫时导致对话框的显示。“显示的对话框”的结果消失了(pop)。
因此,AddDialog返回的未来对象不应指出投机者Show方法的结果。目前有什么方法可以返回未来并在适当的时间返回未来的结果?是的,那是Flutter完成者。
我们应该使用Flutter的完成器来制作模块化桥梁。FUTURE是异步计算的结果,并且完成者是生成未来和控制计算过程的工具。使用一个小示例来显示完成者的使用:
在上面的示例中,我们可以随时调用完整或捕获方法,以结束OpenImagePicker的呼叫;它甚至可以用于组装多个异步操作并执行最终控制,这是非常灵活的。
因此,当呼叫方执行AddDialog,创建一个完整,然后返回完成者。FUTURE等待对话框消失(POP)。可以看出,对话框将在队列中完整。
特别注意:如果在AddDialog期间已经存在对话组,则DialogQueue不会重复该添加,但是它将更新队列中对话的属性数据,并使用对话框的称赞,因为返回值称为AddDialog方法。求职者可能是由多个呼叫者等待的。这样,它可以确保对话框pop(pleaster.future.com)可以接收到当时的回调。
在这一点上,我们将把“添加到列中添加对话”:
步骤3:对话类排序
按优先级排序:优先级越大,优先级弹出越多。由于对话仪和完成者之间的映射关系存储在哈希表中,为了实现排序,数组确定了对话框列表的顺序_sortedkeys。具体实现如下:
步骤4:DialogQueue POP-UP窗口时间
两个机会:
在这一点上,一个简单的对话框完成了,让我们进入坑。
踩踏坑1:在使用过程中,发现POP -UP窗口将直接取消,从而导致队列中的剩余对话框无法弹出。
恢复事件的场景:
这个时候这个问题正在复制。发生了什么?
让我们谈谈结论:Flutter Navigator直接执行PushNameanMoveuntil直接删除,但未来对应于相应的路由元素,该路由元素导致当时显示显示的对话框的后方执行。然后是真实的,无法安排下一个对话框的显示
查看源代码:flutter/lib/src/widgets/navigator.dart
什么是普通流行页面?
因此,可以看出该页面也已删除。删除和弹出本质上是不同的。POP将执行propeleter.future.complete(),然后触发当时的回调,而删除不会。
选项1:监视导航器路线动态更改
原理:当对话符号显示子弹架时,将杜德式的行为及其目标推杆传输到商业方,并且商业方确定了队列的下一步(清除队列或选择机会)。当Dialogqueue目前显示的对话框被无情的删除删除时,队列的炸弹架被迫中断,我们允许商业团队在正确的时间进行维修。
通过在我们的业务中的Widget Materapp的NavigatorObservers中注入我们的自定义RouteObserver,我们可以监视删除页面的情况。
选项2:用于代理NavigatorsState
通过定义全局NavigatorState替换Navigator.of(上下文)以执行页面导航操作。如下:
两种方法都是可行的,除了方案二的入侵略高,但其益处也很明显。请参阅“步入坑2”。
踩踏坑2:子弹盒中的炸弹框架元素容纳已过期的buildContext,这会导致Navigator.of(上下文)为空
结合模型场景,让我们看看问题在哪里:
相应地,当构建业务对话框时,我们经常将这样的句子添加到对话框的取消按钮中,以消失对话框:
注意!此时Navigator.of(上下文)的buildContext上下文实例是从第3页派生的。
然后,当Page3被弹出或删除时,即使上下文实例仍在内存中,我们尝试通过Navigator.of(上下文)为空的NavigatorsState也意味着构建的业务对话框,其Navigator.of。(上下文).pop()不能执行;对话框无法弹出并消失,这意味着“炸弹箱队列无法正常工作”。
因此,解决此问题的方法是进入列表的对话框。使用NavigatorsState时,请勿依赖当前小部件构建中引入的上下文。
踩踏坑3:可以按顺序停止POP -UP队列,这将中断用户的业务流程
例如,当用户在Pagea期间收到多个炸弹框架请求时,处理1号对话框时,PageB跳跃将被触发;1号对话框的消失将自动触发2号对话框的pop-up。
合理的方法是,当用户跳到PAGEB时,子弹队列停止工作并在处理业务时返回Pagea,并且第二号炸弹框架再次出现:
基于此,DialogQueue应提供暂停()和简历(),以促进用户随时暂停或恢复队列的执行;此外,应包装方法:允许对Dialogqueue执行页面时,当页面跳到页面前的页面时执行对话。
在这一点上,结合上述炸弹框架设计的基本模型 +上述凹坑的边界处理,有:
pub.dev:dialog_queue github:flutter_dialog_queue
结尾
原始:https://juejin.cn/post/7099834211418243103