Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 省道地图:无法使用添加项目时使用的同一密钥从中检索项目_Flutter_Dart - Fatal编程技术网

Flutter 省道地图:无法使用添加项目时使用的同一密钥从中检索项目

Flutter 省道地图:无法使用添加项目时使用的同一密钥从中检索项目,flutter,dart,Flutter,Dart,我有一个银行类,它包含汇率。我可以向地图中添加项目,但无法使用我在地图中使用的相同键检索值 class Bank { Map<Map<String, String>, double> _exchangeRates = Map(); void addExchangeRate(String from, String to, double i) { _exchangeRates[{from: to}] = i; } double getExcha

我有一个
银行
,它包含
汇率
。我可以向地图中添加项目,但无法使用我在地图中使用的相同键检索

class Bank {


  Map<Map<String, String>, double> _exchangeRates = Map();

  void addExchangeRate(String from, String to, double i) {
    _exchangeRates[{from: to}] = i;
  }

  double getExchangeRate(String from, String to) {
    return _exchangeRates[{from, to}];
  }

}

 void main(){
  Bank bank = Bank();
      bank.addExchangeRate("USD", "CHF", 2);
      bank.addExchangeRate("INR", "USD", 1 / 60);
      bank.addExchangeRate("INR", "NRS", 160/100);
      print(bank.getExchangeRate("USD","CHF"));
      print(bank.getExchangeRate("INR","USD"));
      print(bank.getExchangeRate("INR","NRS"));
}

这是因为您使用对象作为键,但当您尝试检索值时,您正在创建新对象,因此结果值为null

我将使用
String
作为由
from
to
值组成的键,如下所示:

class Bank {

  Map<String, double> _exchangeRates = Map();

  void addExchangeRate(String from, String to, double i) {
    _exchangeRates["$from$to"] = i;
  }

  double getExchangeRate(String from, String to) {
    return _exchangeRates["$from$to"];
  }

}

void main() {
Bank bank = Bank();
      bank.addExchangeRate("USD", "CHF", 2);
      bank.addExchangeRate("INR", "USD", 1 / 60);
      bank.addExchangeRate("INR", "NRS", 160/100);
      print(bank.getExchangeRate("USD","CHF"));
      print(bank.getExchangeRate("INR","USD"));
      print(bank.getExchangeRate("INR","NRS"));
}
类库{
Map _exchangeRates=Map();
无效加法交换率(字符串从、字符串到、双i){
_汇率[“$从$到”]=i;
}
双getExchangeRate(字符串从,字符串到){
返回_汇率[“$从$到”];
}
}
void main(){
银行=银行();
银行附加汇率(“美元”、“瑞士法郎”,2);
银行附加汇率(“印度卢比”,“美元”,1/60);
银行附加汇率(“印度卢比”,“尼泊尔卢比”,160/100);
打印(银行兑换率(“美元”、“瑞士法郎”);
打印(银行兑换汇率(“印度卢比”、“美元”);
打印(银行兑换率(“印度卢比”、“尼泊尔卢比”);
}

问题是,在
Dart
中,所有东西都是一个对象,而您要搜索的
地图
与您要搜索的
地图
不一样。所以你得到了空值。你需要先进的方法

这就是解决方案:

import 'package:collection/collection.dart';

class Bank {
  Function equals = const MapEquality().equals;
  Map<Map<String, String>, double> _exchangeRates = Map();

  void addExchangeRate(String from, String to, double i) {
    _exchangeRates[{from: to}] = i;
  }

  double getExchangeRate(String from, String to) {
    return _exchangeRates[_exchangeRates.keys.firstWhere((entry){
      return equals(entry, {from : to});
    })];
  }
}

void main() {
  Bank bank = Bank();
  bank.addExchangeRate('USD', 'CHF', 2);
  bank.addExchangeRate('INR', 'USD', 1 / 60);
  bank.addExchangeRate('INR', 'NRS', 160 / 100);
  print(bank.getExchangeRate('USD', 'CHF'));
  print(bank.getExchangeRate('INR', 'USD'));
  print(bank.getExchangeRate('INR', 'NRS'));
}
import'package:collection/collection.dart';
班级银行{
函数equals=const MapEquality().equals;
Map _exchangeRates=Map();
无效加法交换率(字符串从、字符串到、双i){
_交换率[{from:to}]=i;
}
双getExchangeRate(字符串从,字符串到){
return _exchangeRates[_exchangeRates.keys.firstWhere((条目){
返回等于(条目,{from:to});
})];
}
}
void main(){
银行=银行();
银行附加汇率('USD','CHF',2);
银行附加汇率('INR','USD',1/60);
银行附加汇率('INR','NRS',160/100);
打印(bank.getExchangeRate('USD','CHF'));
打印(银行兑换率('INR','USD');
打印(bank.getExchangeRate('INR','NRS'));
}

作为第三种选择,我建议使用带有非标准等式的
映射。这是包
集合
中的
MapEquality
的预期用途之一

import 'package:collection/collection.dart';

class Bank {
  static const _me = MapEquality();
  Map<Map<String, String>, double> _exchangeRates = 
      Map(equals: _me.equals, hashCode: _me.hash);

  void addExchangeRate(String from, String to, double i) {
    _exchangeRates[{from: to}] = i;
  }

  double getExchangeRate(String from, String to) =>
      _exchangeRates[{from: to}];
}

void main() {
  Bank bank = Bank();
  bank.addExchangeRate('USD', 'CHF', 2);
  bank.addExchangeRate('INR', 'USD', 1 / 60);
  bank.addExchangeRate('INR', 'NRS', 160 / 100);
  print(bank.getExchangeRate('USD', 'CHF'));
  print(bank.getExchangeRate('INR', 'USD'));
  print(bank.getExchangeRate('INR', 'NRS'));
}

然后使用
StringPair(from,to)
作为键,而不是
{from:to}

在2分钟、1分钟、38秒、2秒内看到这个计数器,您可以接受它。最后是绿色的滴答声。。干杯我看@diegoveloper,但我的答案不同,有时你可能需要在地图中使用地图,你知道:)让我们把这个答案留到将来。当然,没关系,我更喜欢保持简单,因为在这种情况下,这个答案是问题,尽管我不需要它。
import 'package:collection/collection.dart';

class Bank {
  static const _me = MapEquality();
  Map<Map<String, String>, double> _exchangeRates = 
      Map(equals: _me.equals, hashCode: _me.hash);

  void addExchangeRate(String from, String to, double i) {
    _exchangeRates[{from: to}] = i;
  }

  double getExchangeRate(String from, String to) =>
      _exchangeRates[{from: to}];
}

void main() {
  Bank bank = Bank();
  bank.addExchangeRate('USD', 'CHF', 2);
  bank.addExchangeRate('INR', 'USD', 1 / 60);
  bank.addExchangeRate('INR', 'NRS', 160 / 100);
  print(bank.getExchangeRate('USD', 'CHF'));
  print(bank.getExchangeRate('INR', 'USD'));
  print(bank.getExchangeRate('INR', 'NRS'));
}
class _StringPair {
  final String first;
  final String second;
  _StringPair(this.first, this.second);
  int get hashCode => (first.hashCode * 37 + second.hashCode * 17) & 0x3FFFFFFF;
  bool operator==(Object other) => 
      other is _StringPair && first == other.first && second == other.second;
}