#flutter
Вопрос:
я хотел бы знать, в чем разница между использованием setState и моментального снимка при извлечении API, например, способ, которым я извлекаю api, выглядит следующим образом
Widget text = Container;
Future<AnyClass> fetch() async{
final response = await http
.get(Uri.parse('https://jsonplaceholder.typicode.com/albums/1'));
var result = AnyClass.fromJson(jsonDecode(response.body));
setState(()=> text = result.title)
}
@override
Widget build(BuildContext context) {
return Contianer(child:text)
}
существует другой способ, который использует моментальный снимок для извлечения данных вместо использования состояния, как показано ниже
Future<Album> fetchAlbum() async { final response = await http
.get(Uri.parse('https://jsonplaceholder.typicode.com/albums/1'));
return Album.fromJson(jsonDecode(response.body));
} @override void initState() {
super.initState();
futureAlbum = fetchAlbum(); } @override Widget build(BuildContext context) {
return MaterialApp(
title: 'Fetch Data Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: const Text('Fetch Data Example'),
),
body: Center(
child: FutureBuilder<Album>(
future: futureAlbum,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data!.title);
} else if (snapshot.hasError) {
return Text('${snapshot.error}');
}
// By default, show a loading spinner.
return const CircularProgressIndicator();
},
),
),
),
); }
поэтому я хотел бы знать, в чем разница между этими двумя методами. Спасибо
Ответ №1:
Нет, вы можете проверить FutureBuilder
исходный код, чтобы убедиться, что он делает то же самое: звоните setState
, когда у него есть ответ.
Преимуществом FutureBuilder
являются:
- Простота управления различными состояниями (загрузка, загружено, сбой)
- Вам не нужно создавать
StatefulWidget
, что означает меньшее количество строк кода