You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Web使用Beamer路由:URL变更但页面未自动导航

问题分析

登录成功后调用beamToNamed执行跳转,浏览器URL已更新,但页面停留在登录页,仅刷新后才切换到目标页面,核心原因是Beamer未正确响应导航指令,常见触发场景包括上下文关联错误、导航方式未适配Beamer机制、状态变更未同步至Beamer。

解决方案

以下几种方法可逐一尝试:

1. 使用全局RouterDelegate直接导航

将根组件中的routerDelegate设为全局可访问,绕过上下文可能带来的关联问题:

  • 修改_MyAppState中的routerDelegate定义:
class _MyAppState extends State<MyApp> {
  // 改为static,让外部可直接调用
  static final routerDelegate = BeamerDelegate(
    locationBuilder: RoutesLocationBuilder(
      routes: {
        // 原路由配置保持不变
      }
    )
  );

  // 其他代码不变
}
  • 登录回调中直接调用全局实例:
AuthController().signInWithEmailAndPassword(email, password, () {
  Fluttertoast.showToast(msg: 'Please wait');
  _MyAppState.routerDelegate.beamToNamed('/main/home');
});

2. 指定获取根Beamer实例

如果必须使用上下文,添加root: true参数确保获取的是根级BeamerDelegate:

AuthController().signInWithEmailAndPassword(email, password, () {
  Fluttertoast.showToast(msg: 'Please wait');
  // 强制获取根Beamer实例
  Beamer.of(context, root: true).beamToNamed('/main/home');
});

3. 替换当前路由栈

使用replace: true参数替换当前登录页,避免栈中残留旧页面导致的显示异常:

AuthController().signInWithEmailAndPassword(email, password, () {
  Fluttertoast.showToast(msg: 'Please wait');
  Beamer.of(context).beamToNamed('/main/home', replace: true);
});

4. 让Beamer感知认证状态变化

如果登录状态由全局状态管理(如Provider、GetX),可在Beamer的locationBuilder中根据认证状态自动路由,确保状态变更时Beamer重新构建:

final routerDelegate = BeamerDelegate(
  locationBuilder: (routeInfo, params) {
    // 假设AuthController提供isLoggedIn方法判断登录状态
    bool isLoggedIn = AuthController().isLoggedIn;
    
    // 未登录且当前路由不是登录页时,自动跳转到登录页
    if (!isLoggedIn && routeInfo.location != '/sign_in') {
      return BeamState.fromUri(Uri.parse('/sign_in'));
    }
    
    // 已登录则使用原路由配置
    return RoutesLocationBuilder(
      routes: {
        // 原路由配置保持不变
      }
    ).call(routeInfo, params);
  }
);

内容的提问来源于stack exchange,提问作者Danish Ajaib

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:56:29