Flutter报错:'(BuildContext,SplashViewModel)=>Widget'不是指定子类型
解决Flutter类型不匹配错误:
type '(BuildContext, SplashViewModel) => Widget' is not a subtype of type '(BuildContext, dynamic) => Widget' 错误原因
问题出在BaseView的状态类_BaseViewState未绑定泛型参数,导致widget类型被推断为BaseView<dynamic>,传递给onPageBuilder的参数类型变为dynamic,与你定义的(BuildContext, SplashViewModel) => Widget签名不匹配。
修复步骤
1. 修改BaseWidget中的状态类,添加泛型绑定
将_BaseViewState改为泛型类,使其与BaseView<T>的泛型关联:
import 'package:flutter/material.dart'; class BaseView<T> extends StatefulWidget { const BaseView({ required this.viewModel, required this.onPageBuilder, super.key, this.onModelReady, this.onDispose, }); final Widget Function(BuildContext context, T value) onPageBuilder; final T viewModel; final void Function(T model)? onModelReady; final VoidCallback? onDispose; @override State<BaseView<T>> createState() => _BaseViewState<T>(); } class _BaseViewState<T> extends State<BaseView<T>> { @override void initState() { super.initState(); widget.onModelReady?.call(widget.viewModel); } @override void dispose() { super.dispose(); widget.onDispose?.call(); } @override Widget build(BuildContext context) { return widget.onPageBuilder(context, widget.viewModel); } }
2. 简化SplashView中的onModelReady定义
无需再使用dynamic类型和强制转换,直接用SplashViewModel作为参数类型:
import 'package:flutter/material.dart'; import 'package:motiontraq/core/base/state/base_state.dart'; import 'package:motiontraq/core/base/view/base_widget.dart'; import 'package:motiontraq/view/authentication/splash/splash_view_model.dart'; class SplashScreen extends StatefulWidget { const SplashScreen({super.key}); @override State<SplashScreen> createState() => _SplashScreenState(); } class _SplashScreenState extends BaseState<SplashScreen> { SplashViewModel viewModel = SplashViewModel(); void onModelReady(SplashViewModel model) { viewModel = model; } @override Widget build(BuildContext context) { return BaseView<SplashViewModel>( viewModel: viewModel, onModelReady: onModelReady, onPageBuilder: (context, value) => scaffoldBody(), ); } Widget scaffoldBody() { return Scaffold( body: Center(child: Text(viewModel.deneme)), ); } }
额外优化(可选)
可以直接在onPageBuilder中使用传入的value实例,无需维护自己的viewModel变量,进一步简化代码:
@override Widget build(BuildContext context) { return BaseView<SplashViewModel>( viewModel: SplashViewModel(), onModelReady: (model) { // 此处可执行ViewModel初始化操作,如调用方法 }, onPageBuilder: (context, viewModel) => Scaffold( body: Center(child: Text(viewModel.deneme)), ), ); }
内容的提问来源于stack exchange,提问作者MertYavuz
相关产品推荐
相关产品推荐

