无法将参数类型“字符串”分配给参数类型“字符串”

时间:2021-07-26 22:21:11

标签: flutter dart compiler-errors

我在下面的代码中收到错误“无法将参数类型‘字符串’分配给参数类型‘字符串’”:

import 'dart:async';

abstract class SettingsBase {
  Future<String> getSetting<String>(String key);
  Future saveSetting<String>(String key, String value);
}

class InMemorySetting extends SettingsBase {
  final settings = <String, String>{};

  @override
  Future<String> getSetting<String>(String key) {
    if (settings.containsKey(key)) {
      return Future.value(settings[key] as String);
    }

    if (key == "theme") {
      return Future.value("light" as String);
    }

    throw UnimplementedError();
  }

  @override
  Future saveSetting<String>(String key, String value) {
    settings.putIfAbsent(key, () => value);
    return Future.value(true);
  }
}

我错过了什么?

enter image description here

3 个答案:

答案 0 :(得分:2)

阅读一些关于 generic 是什么的书。

我不知道为什么,但是您在抽象类中为函数原型添加了一个泛型,名称为 String。所以 keyvalue 参数的类型是泛型类型,只是占位符名称为 String

删除那些泛型:

import 'dart:async';

abstract class SettingsBase {
  Future<String> getSetting(String key);
  Future saveSetting(String key, String value);
}

class InMemorySetting extends SettingsBase {
  final settings = <String, String>{};

  @override
  Future<String> getSetting(String key) {
    if (settings.containsKey(key)) {
      return Future.value(settings[key] as String);
    }

    if (key == "theme") {
      return Future.value("light" as String);
    }

    throw UnimplementedError();
  }

  @override
  Future saveSetting(String key, String value) {
    settings.putIfAbsent(key, () => value);
    return Future.value(true);
  }
}

答案 1 :(得分:1)

您正在使用覆盖 Dart 的 String 类型的通用 String 类型。

删除多余的字符串

getSetting<String>

答案 2 :(得分:0)

事实证明,我在方法中添加了一个名为 String 的额外泛型类型参数。下面的代码有效。

import 'dart:async';

abstract class SettingsBase {
  Future<String> getSetting<String>(String key);
  Future saveSetting(String key, String value);
}

class InMemorySetting extends SettingsBase {
  final settings = <String, String>{};

  @override
  Future<String> getSetting<String>(String key) {
    if (settings.containsKey(key)) {
      return Future.value(settings[key] as String);
    }

    if (key == "theme") {
      return Future.value("light" as String);
    }

    throw UnimplementedError();
  }

  @override
  Future saveSetting(String key, String value) {
    settings.putIfAbsent(key, () => value);
    return Future.value(true);
  }
}