使用go_router调用pop()后,routeInformationProvider返回URI不正确的原因咨询
GoRouter调用pop()后获取URI不正确的原因
问题场景
在Flutter应用中使用go_router: ^12.1.3,通过以下代码获取当前路由的URI:
final uri = GoRouter.of(context).routeInformationProvider.value.uri
调用context.pop()后,上述代码返回的URI不符合预期;但调用context.go()或context.goNamed()时,返回的URI是正确的。
核心原因
这是由routeInformationProvider的设计定位和pop()操作的路由更新机制差异导致的:
routeInformationProvider的核心作用是同步路由信息到操作系统的导航系统(比如浏览器地址栏、Android系统返回栈记录),它的更新时机和路由栈的本地调整不同步。go()/goNamed()属于显式的路由跳转,会直接替换或新增路由栈条目,GoRouter会立即触发routeInformationProvider的状态更新,确保URI与当前路由栈一致。pop()是移除路由栈顶层条目,属于本地路由栈的轻量化调整,GoRouter默认不会主动触发routeInformationProvider的notifyListeners()方法,导致你读取到的uri还是pop()操作之前的旧值。
正确的获取方式
要实时获取当前路由的正确URI,应该直接读取GoRouter的路由栈实时状态,而非依赖routeInformationProvider,比如:
// 方式1:通过routerDelegate获取 final uri = GoRouter.of(context).routerDelegate.currentConfiguration.uri; // 方式2:通过GoRouterState获取 final uri = GoRouterState.of(context).uri;
这两种方式都会直接读取路由栈的当前状态,无论pop()还是go()操作,都能返回正确的URI。
内容的提问来源于stack exchange,提问作者Aimn Blbol
相关产品推荐
相关产品推荐

