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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:42:49