飞镖/颤振-抽象类不起作用

时间:2020-03-18 17:16:41

标签: flutter dart

我正在尝试使用当前代码制作通用下拉窗口小部件:

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)

我在做什么错了?

1 个答案:

答案 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成员。