我正在尝试使用当前代码制作通用下拉窗口小部件:
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
abstract class FormDropdownProtocol {
String get title;
}
class FormDropdown<FormDropdownProtocol> extends StatelessWidget {
const FormDropdown({this.value, this.items, this.onChanged});
final FormDropdownProtocol value;
final List<FormDropdownProtocol> items;
final ValueChanged<FormDropdownProtocol> onChanged;
@override
Widget build(BuildContext context) {
return DropdownButton<FormDropdownProtocol>(
value: value,
items: items.map<DropdownMenuItem<FormDropdownProtocol>>(
(FormDropdownProtocol value) {
return DropdownMenuItem<FormDropdownProtocol>(
value: value,
child: Text(value.title),
);
}).toList(),
onChanged: onChanged,
);
}
}
但是尝试使用标题时出现以下错误:
错误:未为类“对象”定义吸气剂“标题”。 -“对象”来自“ dart:core”。 尝试将名称更正为现有吸气剂的名称,或者定义一个名为>'title'的吸气剂或字段。 子:Text(value.title)
我在做什么错了?
答案 0 :(得分:0)
class FormDropdown<FormDropdownProtocol> extends StatelessWidget {
这定义了带有名为FormDropdown
的类型参数的通用类(FormDropdownProtocol
)。该类型参数可以命名为任何东西。弄清楚发生了什么可能更清楚了:
class FormDropdown<T> extends StatelessWidget {
Dart泛型与C ++模板不同,在解决所有问题之前,C ++模板使用正式的类型信息实例化了该类。使用Dart,可以在使用类型实例化泛型之前解决所有问题。
对于class FormDropdown<T>
,T
一无所知。没有给出约束,因此只能推论为Object
。实际上,Object
没有title
成员。
如果您改为使用class FormDropdown<T extends FormDropdownProtocol>
,则现在将T
限制为FormDropdownProtocol
,它确实有一个title
成员。