Флаттер setState против моментального снимка

#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 , что означает меньшее количество строк кода