Flutter自定义导航路由Map如何强制指定多维结构的键名与数据类型
约束路由Map固定字段的实现方案
推荐使用自定义类型替换嵌套Map的方式实现编译期强校验,有两种常用实现方式:
方案1:自定义实体类(兼容所有Dart版本)
这是最通用的方案,通过声明固定字段的实体类,直接约束路由值的结构:
首先定义路由配置类:
class RouteConfig { final String pageType; final dynamic altColor; final Widget pageContent; const RouteConfig({ required this.pageType, required this.altColor, required this.pageContent, }); }
修改UINav类的routes属性类型:
class UINav extends StatelessWidget { final Map<String, RouteConfig> routes; const UINav({super.key, required this.routes}); // 调用示例:直接通过属性取对应值,无需手写字符串key // Widget? homePage = routes['/home']?.pageContent; ... }
使用示例:
final customRoutes = { '/home': RouteConfig( pageType: 'home', altColor: Colors.blueAccent, pageContent: const HomePage(), ), '/profile': RouteConfig( pageType: 'profile', altColor: null, pageContent: const ProfilePage(), ), };
方案2:Dart 3+ 记录(Record)类型(轻量方案)
如果使用Dart 3及以上版本,可以用记录类型无需单独声明类,直接约束结构:
// 定义记录类型的路由结构 typedef RouteConfig = ({ String pageType, dynamic altColor, Widget pageContent, }); class UINav extends StatelessWidget { final Map<String, RouteConfig> routes; const UINav({super.key, required this.routes}); ... }
使用示例:
final customRoutes = { '/home': ( pageType: 'home', altColor: Colors.blueAccent, pageContent: const HomePage(), ), };
两种方案都可以在编译期强制校验三个字段的存在和对应类型,不符合要求的参数会直接抛出编译错误,避免运行期异常。
内容的提问来源于stack exchange,提问作者Walrus
相关产品推荐
相关产品推荐

