You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
考虑到课程安排、考试和实验的数据标识方式不同,因此,所有课程通过来源、索引、周/天 和 节次 范围匹配;考试通过索引和开始时间匹配;实验通过索引和时间范围匹配,因此 Widget 行 URI 同时包含了结构字段和时间字段。
潜在问题
该 feature 的引入可能会导致一个潜在问题。具体地,在应用已经打开时回到桌面再点击小部件,Flutter 内置的 deep link 机制会尝试将 Widget 的 URI 解释为普通路由,从而会引发错误
Could not find a generator for route RouteSettings("/?source=...", null)
为了解决这一问题,零音为 MainActivity 禁用了 Flutter 的自动 deep link 处理(通过 meta-data 设置 flutter_deeplinking_enabled 为 false),并添加了防御性的 onGenerateRoute 回滚,以确保在极为特殊的情况下,若 Widget 路由仍然到达了 Flutter 路由解析器,也不会导致应用崩溃。
但正如前文所说,零音并不确定是否已 properly handle 了此问题。
测试
零音在自己的设备上完成了测试,表现符合该 PR 的预期。
说明
本 PR 有意将 xdyou://classtable 作为内部 Widget 的启动 URI。未在 Android 中注册公开的外部应用链接 scheme,因此该变更不会有意暴露新的公开 deep link URI。即,本 PR 中的 deep link 支持仅用于内部 Widget 交互,并不作为公共 API 对外公开。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
摘要
该 Pull Request 为 Android 侧日程 Widget 添加点击交互功能,同时为日程引入 deep link 支持。应用现在可以处理来自 Widget(或外部启动)的链接,直接跳转到指定的课程、考试或实验详情页。 具体地,点击该 Widget 的头部(
XDYou 日程信息、M月D日 周X 第 W 周)会跳转到日程页面;点击该 Widget 的具体日程可以跳转到其详情页面,效果类似于在 app 日程页面点击某一日程后查看详情。主要变更
在 Android Widget 侧:零音为 Glance Widget 的头部和日程行添加了点击动作。点击头部后,头部通过内部 URI 直接打开日程页面。点击日程行时,日程行通过携带日程元数据的内部 URI 打开日程页面,日程页面匹配对应日程后打开对应日程。这里,日程元数据包括来源类型、索引、周索引、天索引、开始/结束时间等。为达成这一点,零音为
TimeLineItem扩展了点击定位所需的元数据,同时保留了现有的 今天/明天 切换功能。在 Flutter 侧:零音添加了
ClassTableLaunchTarget用于解析小部件的启动 URI;添加了一个小部件启动处理器,将有效的小部件 URI 转换为日程页面的导航;将HomeWidget.widgetClicked和HomeWidget.initiallyLaunchedFromHomeWidget()连接到主页;通过现有的路由解析器将启动目标数据传递到日程页面。在日程页面,应用首先会进行匹配:如果匹配,则打开详情;否则进入日程页面而非直接失败。在 Android 清单侧,零音为
MainActivity添加了home_widget启动意图动作。这里有一个潜在问题,零音不确定自己是否 properly handle 了该问题,将在后文说明。设计说明
Android 小部件是使用 Jetpack Glance 实现的原生 Android 应用小部件。考虑到该项目已经在使用
home_widget,故该 PR 力求桥接层精简。具体地:零音不愿引入自定义的平台通道或一套并行的 Android <-> Flutter 导航系统。对于日程详情导航,Widget 不会将 serialized 的完整日程对象传回 Flutter,而是传递相对稳定的标识元数据,让 Flutter 根据自己的当前课表状态匹配。零音预期 Android widget 数据模型的轻量化和交流的简洁,避免跨平台重复完整的详情渲染契约。
考虑到课程安排、考试和实验的数据标识方式不同,因此,所有课程通过来源、索引、周/天 和 节次 范围匹配;考试通过索引和开始时间匹配;实验通过索引和时间范围匹配,因此 Widget 行 URI 同时包含了结构字段和时间字段。
潜在问题
该 feature 的引入可能会导致一个潜在问题。具体地,在应用已经打开时回到桌面再点击小部件,Flutter 内置的 deep link 机制会尝试将 Widget 的 URI 解释为普通路由,从而会引发错误
为了解决这一问题,零音为
MainActivity禁用了 Flutter 的自动 deep link 处理(通过meta-data设置flutter_deeplinking_enabled为false),并添加了防御性的onGenerateRoute回滚,以确保在极为特殊的情况下,若 Widget 路由仍然到达了 Flutter 路由解析器,也不会导致应用崩溃。但正如前文所说,零音并不确定是否已 properly handle 了此问题。
测试
零音在自己的设备上完成了测试,表现符合该 PR 的预期。
说明
本 PR 有意将
xdyou://classtable作为内部 Widget 的启动 URI。未在 Android 中注册公开的外部应用链接 scheme,因此该变更不会有意暴露新的公开 deep link URI。即,本 PR 中的 deep link 支持仅用于内部 Widget 交互,并不作为公共 API 对外公开。