Как я могу интерполировать строку, которая поступает из базы данных?

#flutter #dart #string-interpolation

#flutter #dart #строка-интерполяция

Вопрос:

Я использую Firebase с приложением Flutter, и мне нужно сохранить в нем значение строки, которое будет интерполировано на основе других значений из Firebase.

Запись в Firebase:

 {
  'template': '$amount kg of $fruit',
  'amount': '5',
  'fruit': 'oranges'
}
 

Что я делаю:

 String get amount => _snapshot.data()['amount'];
String get fruit => _snapshot.data()['fruit'];

Widget build(BuildContext context) {

  return Text(_snapshot.data()['template']);
}
 

Что я ожидаю: 5kg of oranges , что отображает Flutter: $amount kg of $fruit .

Как я могу вставить значения из amount и fruit в template ? Идея в том, что каждая запись может настраивать, как она будет выглядеть, поэтому другая запись может иметь $fruit: $amount kg или любую комбинацию amount и fruit

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

1. Вы могли бы сделать что-то вроде _snapshot.data()['template'].replaceFirst('$amount',amount) и то же самое с fruit

2. Вы просто работаете с этим набором данных? Если это так, учитывая, что вы знаете имена полей данных, вы бы просто заменили «$ amount» и «$ fruit» данными для этих двух? Или записи, полученные из Firebase, потенциально будут иметь разные имена полей данных (но всегда поле «шаблон»), и вам нужно динамически выполнять интерполяцию?

3. @Craig, у них потенциально могут быть разные имена полей данных

Ответ №1:

Интерполяция строк выполняется во время компиляции и поэтому работает только с постоянными строками. Во время выполнения код не может перечислять переменные по кругу, поэтому интерполяция невозможна, что хорошо как для безопасности, так и для эффективности.

Как было предложено ibrahimxcool, используйте replaceFirst или replaceAll метод в String :

 _snapshot.data()['template']
  .replaceAll('$amount', amount)
  .replaceAll('$fruit', fruit)
;