Flutter如何根据登录用户类型跳转指定页面,权限校验代码应放何处?
Flutter 页面权限校验实现方案
不要每个页面单独编写校验逻辑,也不要把全量校验逻辑堆在main.dart中,最优方案是结合路由拦截做统一的权限控制
两种方案的弊端
- 每个页面单独写校验:代码冗余极高,后续调整权限规则需要修改所有页面,维护成本极高,还容易出现漏改导致的权限漏洞
- 全部逻辑堆在main.dart:main.dart仅适合做App全局初始化、根组件配置、初始路由指定,塞入过多权限逻辑会导致入口文件过度臃肿,后续迭代难以维护
推荐实现步骤
1. 先封装通用的token获取工具
把你的getToken方法封装到全局工具类中,方便后续统一调用,避免重复代码:
class SpUtil { static Future<String?> getToken() async { SharedPreferences sharedPreferences = await SharedPreferences.getInstance(); return sharedPreferences.getString("token"); } }
2. 用路由拦截做统一权限校验
不管你用原生Navigator还是GetX、Fluro这类第三方路由框架,都可以通过路由拦截钩子统一处理权限判断,不需要侵入每个页面的代码:
以原生Navigator为例,在MaterialApp的onGenerateRoute钩子中做拦截:
// 先定义需要登录才能访问的页面路由列表 List<String> needLoginRoutes = ['/pageC', '/pageD', '/userCenter']; MaterialApp( onGenerateRoute: (settings) async { // 要访问的路由需要登录权限 if(needLoginRoutes.contains(settings.name)) { // 先判断有没有token String? token = await SpUtil.getToken(); if(token == null) { // 无token,直接跳转到登录页,或者返回页A/页B的提示 return MaterialPageRoute(builder: (context) => const LoginPage()); } } // 校验通过,放行对应页面 return MaterialPageRoute(settings: settings, builder: ...); } )
3. 初始页判断逻辑可以放在main.dart中
如果需要App启动的时候直接判断用户登录状态,指定进入首页还是公共页面,这部分逻辑可以放在main函数的初始化阶段:
void main() async { // 初始化Flutter绑定 WidgetsFlutterBinding.ensureInitialized(); // 获取token判断初始路由 String? token = await SpUtil.getToken(); runApp(MyApp(initialRoute: token != null ? '/home' : '/pageA')); }
注意:本地存储的token仅做前端页面拦截使用,所有需要权限的后端接口必须单独做token合法性校验,避免前端被篡改后绕过权限控制
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

