Flutter声明CardView类时提示默认构造函数已定义错误如何解决
问题原因分析
Dart语言不支持传统的构造函数重载,同一个类中只能存在一个未命名的默认构造函数,你在CardView类中定义了两个未命名构造函数,即便参数格式不同也会被判定为重复定义,因此触发该报错。
排查步骤
- 检查目标类的所有构造函数定义,确认是否存在多个没有指定构造名的构造函数
- 核对两个构造函数的参数、使用场景,确认你实际需要保留的构造形式
解决方案
根据你的使用场景,有三种可选解决方式:
方式1:仅保留命名参数构造(推荐,符合Flutter官方Widget编写规范)
删掉第二个位置参数的构造函数即可,代码修改后如下:
import 'package:flutter/material.dart'; import 'package:untitled5/model/card_model.dart'; class CardView extends StatefulWidget { const CardView({Key? key, required this.card}) : super(key: key); final CardModel card; @override _CardViewState createState() => _CardViewState(); }
使用时调用格式为CardView(card: yourCardInstance)
方式2:仅保留位置参数构造
删掉第一个命名参数的构造函数,如果需要传key可以调整为可选位置参数:
import 'package:flutter/material.dart'; import 'package:untitled5/model/card_model.dart'; class CardView extends StatefulWidget { const CardView(this.card, {Key? key}) : super(key: key); final CardModel card; @override _CardViewState createState() => _CardViewState(); }
使用时调用格式为CardView(yourCardInstance),需要传key时写CardView(yourCardInstance, key: yourKey)
方式3:给其中一个构造函数指定命名
如果你需要同时保留两种调用方式,给其中一个构造函数设置专属名称即可,比如:
import 'package:flutter/material.dart'; import 'package:untitled5/model/card_model.dart'; class CardView extends StatefulWidget { const CardView({Key? key, required this.card}) : super(key: key); // 给位置参数构造指定命名 CardView.fromModel(this.card, {Key? key}) : super(key: key); final CardModel card; @override _CardViewState createState() => _CardViewState(); }
此时两种调用方式分别为CardView(card: yourCardInstance)和CardView.fromModel(yourCardInstance),不会冲突。
内容的提问来源于stack exchange,提问作者javohir
相关产品推荐
相关产品推荐

