Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
January 29, 2022 12:58 pm GMT

Flutter'da FutureBuilder' Anlamak

Bu yazda Flutter'daki FutureBuilder widget'na bir gz atacaz. Balamadan nce, bir adm geriye gidelim ve Flutter'da Futures'n ne olduunu ve asenkron programlama ile nasl allacan anlayalm.

Asenkron Programlama

En temel biiminde, asenkron bir method, programnzn baka bir ilemin tamamlanmasn beklerken yrtlmeye devam etmesine izin verir. Bu, bir ilem tamamlanana kadar dier ilemlerin yrtlmesinin engelledii senkron (ezamanl) programlamadan farkldr.

Bunlara rnekler:

Bir a zerinden veri alma (sonsuz kaydrmay dnn)
Database ilemleri
Dosya I/O ilemleri

Daha nce JavaScript ile altysanz, Promise kavramna ainasnzdr. Dart'ta Future snfna sahibiz ve async ve await anahtar kelimelerini kullanyoruz. ECMAScript 2017 ile, async/await kalb JavaScript ve C# gibi dier programlama dillerinde de mevcuttur.

Bu yazda, basit bir kii listesi uygulamas yapacaz ve bir listeyi asenkron olarak yklemek iin FutureBuilder kullanmn simle edeceiz.

Blm 1

FutureBuilders'n nasl kullanlacana gemeden nce, modelimizi, UI'mizi oluturma ve baz yapay veriler oluturma gibi grevleri tamamlamamz gerekir.

Model

Balang olarak Contact modelimizi tanmlayalm. Basit tutmak birka veri alacaz.

class Contact {  final String? firstName;  final String? lastName;  final String? imageUrl;  final String? phone;  Contact({     this.firstName,     this.lastName,     this.imageUrl,     this.phone,  });}

Contact Card

Bunu yaptktan sonra, kii kartmz iin bir UI oluturalm:

import 'package:flutter/material.dart';import 'models/contact.dart';class ContactCard extends StatelessWidget {  final Contact? contact;  const ContactCard({Key? key, this.contact}) : super(key: key);  @override  Widget build(BuildContext context) {    return Container(      padding: const EdgeInsets.symmetric(horizontal: 10),      decoration: const BoxDecoration(        border: Border(          bottom: BorderSide(            color: Colors.grey,            width: 0.5,          ),        ),      ),      child: Row(        crossAxisAlignment: CrossAxisAlignment.center,        children: [          Container(            padding: const EdgeInsets.only(top: 10, right: 15, bottom: 10),            child: ClipOval(              child: Image.network(                contact!.imageUrl!,                width: 50,                height: 50,              ),            ),          ),          Expanded(            child: Column(              crossAxisAlignment: CrossAxisAlignment.start,              children: [                Text('${contact!.firstName} ${contact!.lastName}'),                const SizedBox(height: 2),                Text('${contact!.phone}'),              ],            ),          ),          Row(            mainAxisSize: MainAxisSize.min,            children: [              Icon(                Icons.create,                color: Colors.grey[600],              ),              const SizedBox(width: 15.0),              Icon(                Icons.message,                color: Colors.grey[600],              ),              const SizedBox(width: 15.0),              Icon(                Icons.call,                color: Colors.grey[600],              ),            ],          ),        ],      ),    );  }}

Dummy Data

Sahte veriler iin, dummy-data.dart dosyasn oluturuyoruz. Artk veri oluturma ve kullanc arayznn bir paras ile ilgili ikincil grevleri tamamladmza gre, imdi elimizdeki ana greve, kiilerimizi grntleyen ListView'i oluturmaya geelim.

import 'package:future_builder/model/contact.dart';List<Contact> dummyData = [  Contact(    firstName: 'Bryan',    lastName: 'Adams',    imageUrl: 'https://picsum.photos/id/1005/100',    phone: '+91 98120 43912',  ),  Contact(    firstName: 'Julia',    lastName: 'Roberts',    imageUrl: 'https://picsum.photos/id/1012/100',    phone: '+91 78230 21385',  ),  Contact(    firstName: 'Samantha',    lastName: 'Drisco',    imageUrl: 'https://picsum.photos/id/1011/100',    phone: '+91 89067 24129',  ),  Contact(    firstName: 'Sean',    lastName: 'Connery',    imageUrl: 'https://picsum.photos/id/1066/100',    phone: '+91 92143 79785',  ),  Contact(    firstName: 'Brad',    lastName: 'Pitt',    imageUrl: 'https://picsum.photos/id/1074/100',    phone: '+91 78941 35361',  ),  Contact(    firstName: 'Joe',    lastName: 'Rogan',    imageUrl: 'https://picsum.photos/id/177/100',    phone: '+91 93124 87877',  ),  Contact(    firstName: 'Jennifer',    lastName: 'Lawrence',    imageUrl: 'https://picsum.photos/id/203/100',    phone: '+91 71324 57585',  ),  Contact(    firstName: 'Margot',    lastName: 'Robbie',    imageUrl: 'https://picsum.photos/id/22/100',    phone: '+91 73414 79879',  ),  Contact(    firstName: 'Al',    lastName: 'Pacino',    imageUrl: 'https://picsum.photos/id/219/100',    phone: '+91 96769 34313',  ),  Contact(    firstName: 'Marilyn',    lastName: 'Monroe',    imageUrl: 'https://picsum.photos/id/171/100',    phone: '+91 84534 74646',  ),  Contact(    firstName: 'Corey',    lastName: 'Taylor',    imageUrl: 'https://picsum.photos/id/158/100',    phone: '+91 98784 13213',  ),  Contact(    firstName: 'Seth',    lastName: 'Rogen',    imageUrl: 'https://picsum.photos/id/145/100',    phone: '+91 73138 43541',  ),  Contact(    firstName: 'Tyler',    lastName: 'Perry',    imageUrl: 'https://picsum.photos/id/1027/100',    phone: '+91 83131 48648',  ),  Contact(    firstName: 'Matt',    lastName: 'Damon',    imageUrl: 'https://picsum.photos/id/1025/100',    phone: '+91 78285 31338',  ),  Contact(    firstName: 'John',    lastName: 'Cena',    imageUrl: 'https://picsum.photos/id/1/100',    phone: '+91 80246 48432',  ),];

Blm 2

Artk contact verilerimizi alacak future' tanmlayabiliriz.

  Future<List<Contact>>? _contacts;  Future<List<Contact>> _getContacts() async {    List<Contact> contacts = dummyData;    await Future.delayed(Duration(seconds: 10));    return Future.value(contacts);  }

Kiilerimizi daha nce tanmladmz dummy data'dan alyoruz. Sonraki satrda Future.delayed() yntemini kullandm greceksiniz. Bu yntem, tanml bir sre boyunca kod yrtmeyi askya almak iin kullanlabilir ve bir sunucudan veri alrken normalde gzlemlenecek olan bir arabellei simle etmemize yardmc olur. Gecikme deeri (delay value) tamamlandnda, Future.value() yntemini kullanarak kii listesini dndrrz.

Bundan sonra yapacamz ey, az nce tanmladmz future' tutacak bir deiken tanmlamaktr.

Future<List<Contact>>? _contacts;

_getContacts() ile future' initState() iindeki _contacts deikenine atadk.

@overridevoid initState() {  super.initState();  _contacts = _getContacts();}

Bunu neden byle yaptmz merak ediyor olmalsnz. Baka bir deiken eklemek yerine dorudan FutureBuilder'a _getContacts()' atayamaz mydk?

Flutter belgelerini gzden geirirseniz, build method'unun herhangi bir zamanda arlabileceini fark edeceksiniz. Buna setState() veya cihaz oryantasyon deiiklii dahildir. Bunun anlam, cihaz yaplandrmasndaki veya widget yeniden oluturmalarndaki herhangi bir deiikliin Future'nz bir ok kez tetiklemesidir. Bunu nlemek iin, Feture'n build() ynteminin kendisinde deil initState() iinde elde edildiinden emin oluruz. Bu, Future yntemini dorudan FutureBuilder'a atayan evrimii birok reticide fark edebileceiniz bir eydir ve aslnda yanltr.

Artk bunu hallettiimize gre, imdi build() method'una bir gz atalm :

@override  Widget build(BuildContext context) {    return FutureBuilder<List<Contact>>(      future: _contacts,      builder: (ctx, snapshot) {        List<Contact>? contacts = snapshot.data;        switch (snapshot.connectionState) {          case ConnectionState.done:            return _buildListView(contacts!);          default:            return _buildLoadingScreen();        }      },    );  }  Widget _buildListView(List<Contact> contacts) {    return ListView.builder(      itemBuilder: (ctx, idx) {        return ContactCard(          contact: contacts[idx],        );      },      itemCount: contacts.length,    );  }  Widget _buildLoadingScreen() {    return Center(      child: Container(        width: 50,        height: 50,        child: CircularProgressIndicator(),      ),    );  }}

FutureBuilder() 'mz bir List tr ile tanmlyoruz. Bu gerekli olmasa da, oluturucu yntemimizde tr karmna yardmc olur. _contacts future'n FutureBuilder'a veriyoruz .

FutureBuilders'n bir avantaj da, bize sunulan ConnectionState enum'na sahip olmamzdr. Anlk grntmzn connection state'ine bal olarak, loading ekran veya hata ekran gibi farkl widget'lar gsterebiliriz.

Temelde bizim iin uygun 4 durumumuz var.

  1. none, baz initial datalarda.
  2. waiting, asenkron (zaman uyumsuz) ilemin baladn gsterir, genellikle veriler botur.
  3. active , veriler bo deildir ve zamanla deiebilir.
  4. done , veriler bo deildir.

Artk tm paralarmz yerletirdiimize gre, uygulamamzn nasl grndne bir gz atalm:

Balangta 10 saniye boyunca grlebilen bir ykleme ekranmz var ve ardndan bunun yerini ListView.builder() alyor. Farkl balant durumlarna gre ek ekranlarmz olabilir, ancak basitlik iin 2 ekrana bal kalacaz.

Zaman uyumsuz programlamann nasl altna baktk ve FutureBuilder ynteminin nasl altn gstermek iin basit bir kii uygulamas tasarladk ve oluturduk. Ayrca Future' neden build ynteminde deil de initState() iinde elde etmemiz gerektiine baktk. Ve son olarak, oluturucumuzda ConnectionState enumlarnn nasl kullanlacan grdk.

Kodun tamamn buradan inceleyebilirsiniz.

References:

https://blog.devgenius.io/understanding-futurebuilder-in-flutter-491501526373
https://api.flutter.dev/flutter/widgets/FutureBuilder/future.html
https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html


Original Link: https://dev.to/gulsenkeskin/flutterda-futurebuilderi-anlamak-1agh

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To