Flutter开发:如何将含if判断的代码抽离为独立可复用方法
动态链接逻辑抽离封装方案
你没法直接抽离这段代码的核心原因是:原代码是写在路由生成函数内部的条件分支,命中密码重置链接规则时会直接返回Redirect路由对象,未命中时需要继续执行后续默认页面的返回逻辑。抽离时只要把方法返回值设为可空的Redirect?类型,未匹配到规则时返回null,调用处判断返回值非空就直接返回跳转结果,为空则继续走原有逻辑即可。
第一步:封装独立处理方法
在AppRouter类中新增私有处理方法(如果需要跨类调用可以去掉方法名前的下划线,改为公开方法):
/// 处理密码重置类动态链接,命中规则返回对应跳转路由,未命中返回null Redirect? _handlePasswordResetDeepLink(PendingDynamicLinkData? initialLink) { // 无有效动态链接直接返回空,走后续默认逻辑 if (initialLink == null) return null; final Uri deepLink = initialLink.link; final String deeplinkString = deepLink.toString(); final String code = deepLink.queryParameters['code'] ?? 'No code'; final int pathStart = deeplinkString.lastIndexOf('/') + 1; final int queryStart = deeplinkString.indexOf('?'); // 兜底处理无query参数的链接场景,避免substring索引越界报错 final String pathSegment = queryStart == -1 ? deeplinkString.substring(pathStart) : deeplinkString.substring(pathStart, queryStart); if (pathSegment == 'password-reset') { return Redirect( '/login/forgot-password', queryParameters: { 'isSendEmail': 'true', 'code': code, }, ); } // 其他类型动态链接暂不处理,返回空走默认逻辑 return null; }
注:这里对原代码做了个小修复:原逻辑如果链接不带
?查询参数,indexOf('?')会返回-1,直接调用substring会触发范围错误,加了分支兜底后兼容性更好。
第二步:替换原有内联逻辑
把原来路由配置里写死的动态链接判断代码,替换为对封装方法的调用即可,以根路由/为例:
'/': (route) { final bool loggedIn = Provider.of<AppState>(context, listen: false).isLoggedIn; // 调用抽离的动态链接处理方法 final Redirect? deepLinkRedirect = _handlePasswordResetDeepLink(initialLink); // 命中动态链接规则直接返回跳转结果 if (deepLinkRedirect != null) return deepLinkRedirect; return const MaterialPage( child: PhoneNumberPage(), ); },
复用方式
后续在任意路由处理逻辑、或者应用生命周期中收到动态链接需要跳转时,直接调用该方法传入动态链接对象,判断返回值非空时执行对应路由跳转即可。如果后续要新增其他动态链接规则(比如活动跳转、邀请链接等),直接在这个独立方法里新增分支判断,不需要在各个路由节点重复写解析逻辑。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

