#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)
и то же самое с fruit2. Вы просто работаете с этим набором данных? Если это так, учитывая, что вы знаете имена полей данных, вы бы просто заменили «$ amount» и «$ fruit» данными для этих двух? Или записи, полученные из Firebase, потенциально будут иметь разные имена полей данных (но всегда поле «шаблон»), и вам нужно динамически выполнять интерполяцию?
3. @Craig, у них потенциально могут быть разные имена полей данных
Ответ №1:
Интерполяция строк выполняется во время компиляции и поэтому работает только с постоянными строками. Во время выполнения код не может перечислять переменные по кругу, поэтому интерполяция невозможна, что хорошо как для безопасности, так и для эффективности.
Как было предложено ibrahimxcool, используйте replaceFirst
или replaceAll
метод в String
:
_snapshot.data()['template']
.replaceAll('$amount', amount)
.replaceAll('$fruit', fruit)
;