Я знаю, что это не null, но Dart этого не знает. Как мне это сказать?

#dart

Вопрос:

Код, на который жалуется Dart:

 Map<String,int> get_frequency(String text) { 
  Map<String,int> retval = {};
  for (int i = 0; i<text.length;   i) { 
    retval[text[i]] = retval[text[i]] ?? 0;
    retval[text[i]]  ; //<---- this is where dart is complaining.*
  }
  return retval;
}

void main() {
  const paragraphOfText = 'Once upon a time there was a Dart programmer who '
      'had a challenging challenge to solve. Though the challenge was great, '
      'a solution did come. The end.';
  var data = get_frequency(paragraphOfText);
  print(data);
}
 

Очевидно, что строка, отмеченная (*), не может быть null , так как же мне сообщить об этом Dart? Я попробовал оператор утверждения null (!), Но это не сработало.

Включена защита от нуля.

Сообщение об ошибке:

 challenge2.dart:5:20: Error: Operator ' ' cannot be called on 'int?' because it is potentially null.
    retval[text[i]]  ;
                   ^
challenge2.dart:5:20: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
    retval[text[i]]  ;
                   ^
 

Комментарии:

1. Если Dart «жалуется»… ТОГДА, ПОЖАЛУЙСТА, СКОПИРУЙТЕ / ВСТАВЬТЕ ТОЧНОЕ СООБЩЕНИЕ ОБ ОШИБКЕ В СВОЙ ВОПРОС! Вопрос: Включена ли защита от null ?

Ответ №1:

Возможное решение — изменить строку

     retval[text[i]]  ; //<---- this is where dart is complaining.*
 

в

     retval[text[i]] = retval[text[i]]!   1;
 

Просто понял это.

Комментарии:

1. Да, в общем, это то, что вы должны сделать. Также смотрите github.com/dart-lang/language/issues/1113 . В вашем случае вы также могли бы объединить его с предыдущей строкой: retval[text[i]] = (retval[text[i]] ?? 0) 1;