#flutter #dart
Вопрос:
dynamic data;
Это функция, в которой я получаю данные для имени компании.
Future<void> getData() async {
final response = await Provider.of<PostApiService>(context, listen: false)
.getData(4.toString() '/service_contracts');
final _getData = GetModel.fromJson(response.body);
print(_getData.company_name);
setState(() => data = _getData.toString());
}
Здесь в текстовом виджете я получаю значение null.
Text(
'Adresa je: $data ',
style: TextStyle(color: AppColors().tabBarText),
),
Как получить значение, например, в функции getData для текстового виджета?
Ответ №1:
Перед вызовом getData()
и во время его выполнения data
будет значение null , потому что все поля, не допускающие позднего обнуления, в Dart инициализируются значением null:
int? i;
print(i); // prints null
Ваш build()
метод запускается, как только ваш виджет вставлен в дерево виджетов, но на данный момент data
он равен нулю, потому getData()
что не завершен. Вы можете решить эту проблему, просто проверив в своем build()
методе, является ли data
он нулевым или нет:
return data == null ? CircularProgressIndicator() : Text('Non-null data: $data');
Ваш вызов setState()
inside getData()
гарантирует, что пользовательский интерфейс будет обновляться при изменении этого значения
Комментарии:
1. Я понимаю, теперь я получаю данные при вызове функции, но как получить данные без функции вызова?
Ответ №2:
Вы всегда можете использовать a FutureBuilder
для ожидания значения из асинхронного метода:
FutureBuilder<YourDataType>(
future: getData(),
initialData: null, // You can set a default value here.
builder: (context, snapshot) {
return snapshot.data == null ?
CircularProgressIndicator() :
Text('Your data: $data');
},
)
Таким образом, вы можете избежать сохранения состояния для данных, которые вы запрашиваете только один раз. Если data
это единственное состояние, в котором вы сейчас находитесь, StatefulWidget
вы можете упростить все и просто использовать StatelessWidget
вместо этого.