Я хочу использовать значение из асинхронной функции в текстовом виджете

#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 вместо этого.