📅  最后修改于: 2023-12-03 14:50:32.200000             🧑  作者: Mango
在使用Flutter开发应用时,经常会遇到这样的错误提示:参数类型“XXX”不能分配给参数类型“YYY”
。这种错误通常是因为传入的参数类型与接收参数的类型不符。本文将以具体的例子来讲解这个错误的原因和解决方法。
先看一下常见的错误示例:
class ChatRoomAppBar extends StatelessWidget implements PreferredSizeWidget {
// ...
}
// ...
return Scaffold(
appBar: ChatRoomAppBar(), // 这里会报错
// ...
);
这段代码中,我们定义了一个自定义的ChatRoomAppBar
组件,并将其用作Scaffold
中的AppBar
。但是在代码中,我们看到了一个红色波浪线,提示了以下错误内容:
The argument type 'ChatRoomAppBar' can't be assigned to the parameter type 'PreferredSizeWidget'.
意思是说,在这里期望传入的是PreferredSizeWidget
类型的组件,但是我们传入的是ChatRoomAppBar
类型的组件。这显然是一个类型不匹配的错误。
接下来,我们来看看解决方法。
首先是在组件中继承预设的组件,例如继承AppBar
,这样我们的自定义组件就自动继承了PreferredSizeWidget
类型,代码如下:
class ChatRoomAppBar extends AppBar {
ChatRoomAppBar()
: super(
// ...
);
}
// ...
return Scaffold(
appBar: ChatRoomAppBar(), // 这里就不会报错了
// ...
);
这里,我们将自定义的ChatRoomAppBar
组件继承了AppBar
,然后在构造函数中直接调用了AppBar
的构造函数,将自定义的一些属性传递给它。
第二种方法是手动实现PreferredSizeWidget
接口。代码如下:
class ChatRoomAppBar extends StatelessWidget implements PreferredSizeWidget {
ChatRoomAppBar({Key? key}) : preferredSize = Size.fromHeight(kToolbarHeight), super(key: key);
@override
final Size preferredSize;
@override
Widget build(BuildContext context) {
// ...
}
}
// ...
return Scaffold(
appBar: ChatRoomAppBar(), // 这里也不会报错了
// ...
);
这里,我们手动实现了PreferredSizeWidget
接口,并在构造函数中初始化了preferredSize
变量,即该组件的大小。这样我们的自定义组件也变成了一个PreferredSizeWidget
类型的组件,可以成功传递给Scaffold
中的appBar
属性。