【问题标题】:Dart / Flutter - abstract class not workingDart / Flutter - 抽象类不起作用
【发布时间】:2020-03-18 17:16:41
【问题描述】:

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

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,
    );
  }
}

但我在尝试使用标题时遇到以下错误:

错误:没有为类“对象”定义吸气剂“标题”。 - “对象”来自“飞镖:核心”。 尝试将名称更正为现有 getter 的名称,或定义一个名为 > 'title' 的 getter 或字段。 孩子:文本(value.title)

我做错了什么?

【问题讨论】:

  • 不知道为什么,但是像这样class FormDropdown&lt;T extends FormDropdownProtocol&gt; 声明类,然后在整个类中使用 T 可以解决所有问题。如果有人知道原因并愿意解释,我很想听听。否则,我会在几天内回答我自己的问题

标签: flutter dart


【解决方案1】:
class FormDropdown<FormDropdownProtocol> extends StatelessWidget {

这定义了一个泛型类 (FormDropdown),其类型参数名为 FormDropdownProtocol。该类型参数可以命名为任何名称;如果是这样,可能会更清楚地了解发生了什么:

class FormDropdown<T> extends StatelessWidget {

Dart 泛型与 C++ 模板不同,在 C++ 模板中,在解决所有问题之前使用正式的类型信息对类进行实例化。使用 Dart,一切都在用类型实例化泛型之前解决。

对于class FormDropdown&lt;T&gt;,对T 一无所知。没有给出约束,所以只能推导出为Object。事实上,Object 没有 title 成员。

如果您改为使用class FormDropdown&lt;T extends FormDropdownProtocol&gt;,那么T 现在被限制为FormDropdownProtocol,它确实有一个title 成员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2021-11-04
    • 2016-02-27
    • 2023-02-01
    • 2022-01-05
    • 2022-10-06
    相关资源
    最近更新 更多