超全模态模型 × Harness 升级,升级解锁 ArkClaw,最新支持 DeepSeek-V4 系列与 GLM-5.1
跟着Supabase+Riverpod迷你教程开发时,使用dart run build_runner watch -d生成自动Provider后,遇到类型错误:
dart run build_runner watch -d
The argument type 'Object?' can't be assigned to the parameter type 'RouterDelegate?' 错误指向EnterApp组件中MaterialApp.router的routerDelegate: routes代码段。根本原因 #Riverpod代码生成器默认会自动推断Provider的返回类型,由于原代码中没有明确指定routeProvider的返回类型,生成器将其推断为Object?或dynamic,但MaterialApp.router要求的routerDelegate参数类型是RouterDelegate<Object>?,而GoRouter本身是实现了RouterDelegate<Object>的,因此出现类型不匹配。正确解决方案 #1. 为Route Provider明确指定返回类型 #修改你的路由文件代码,给@riverpod注解的函数明确指定返回类型为GoRouter:part 'routes.g.dart'; @riverpod GoRouter route(RouteRef _) => _routes; // 明确指定返回类型为GoRouter final _routes = GoRouter( initialLocation: '/', routes: [ GoRoute( path: '/', builder: (context, state) => const MainView(), ), GoRoute( path: '/login', builder: (context, state) => const LoginPage(), ), ], ); 2. 重新生成代码 #运行dart run build_runner watch -d重新生成路由Provider代码,此时生成的routes.g.dart中,RouteRef会被正确定义为AutoDisposeProviderRef<GoRouter>,而非Object?或dynamic。3. 简化EnterApp中的代码 #此时读取Provider时无需任何类型转换,直接使用即可:class EnterApp extends ConsumerWidget { const EnterApp({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final routes = ref.read(routeProvider); return MaterialApp.router( debugShowCheckedModeBanner: false, routerDelegate: routes, ); } } 对临时解决方案的说明 #你之前尝试的两种临时方法:强制类型转换as RouterDelegate<Object>?:能解决当前问题,但属于运行时类型检查,不如编译时明确指定类型安全。将Provider返回类型改为dynamic:虽然能绕过类型检查,但会丢失Dart的类型安全特性,可能隐藏后续开发中的潜在问题,不推荐使用。内容的提问来源于stack exchange,提问作者Julia Pak
错误指向EnterApp组件中MaterialApp.router的routerDelegate: routes代码段。
EnterApp
MaterialApp.router
routerDelegate: routes
Riverpod代码生成器默认会自动推断Provider的返回类型,由于原代码中没有明确指定routeProvider的返回类型,生成器将其推断为Object?或dynamic,但MaterialApp.router要求的routerDelegate参数类型是RouterDelegate<Object>?,而GoRouter本身是实现了RouterDelegate<Object>的,因此出现类型不匹配。
routeProvider
Object?
dynamic
routerDelegate
RouterDelegate<Object>?
GoRouter
RouterDelegate<Object>
修改你的路由文件代码,给@riverpod注解的函数明确指定返回类型为GoRouter:
@riverpod
part 'routes.g.dart'; @riverpod GoRouter route(RouteRef _) => _routes; // 明确指定返回类型为GoRouter final _routes = GoRouter( initialLocation: '/', routes: [ GoRoute( path: '/', builder: (context, state) => const MainView(), ), GoRoute( path: '/login', builder: (context, state) => const LoginPage(), ), ], );
运行dart run build_runner watch -d重新生成路由Provider代码,此时生成的routes.g.dart中,RouteRef会被正确定义为AutoDisposeProviderRef<GoRouter>,而非Object?或dynamic。
routes.g.dart
RouteRef
AutoDisposeProviderRef<GoRouter>
此时读取Provider时无需任何类型转换,直接使用即可:
class EnterApp extends ConsumerWidget { const EnterApp({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final routes = ref.read(routeProvider); return MaterialApp.router( debugShowCheckedModeBanner: false, routerDelegate: routes, ); } }
你之前尝试的两种临时方法:
as RouterDelegate<Object>?
内容的提问来源于stack exchange,提问作者Julia Pak
超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起
模型再升级,30秒超长叙事, 模态参考扩容
模型自由,工具不限,最新支持 Deepseek-V4 系列、GLM-5.3 系列
超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列
大模型19元起,Al应用9.9元畅享,新人首购爆款尽享优惠