Ana içeriğe atla

.family

Bunu okumadan önce, providers ve onların nasıl okunacağı hakkında bilgi almayı düşünün. Bu bölümde .family provider'ları değiştiricisinden detaylı olarak bahsedeceğiz.

.family değiştiricisinin tek bir amacı vardır: harici değerlerden bir provider oluşturmak.

Aile için bazı yaygın kullanım durumları şunlardır:

  • Kimliğinden bir "Mesaj" almak için FutureProvider'ı ".family" ile birleştirin.
  • Geçerli Yerel Ayar'ı bir provider'a iletin, böylece çevirileri biz halledebiliriz.

Kullanım

Ailelerin çalışma şekli, provider'a ek bir parametre eklemektir. Bu parametre provider'ımızda bir durum oluşturmak için serbestçe kullanılabilir.

Örneğin, kimliğinden bir "Mesaj" almak için "aile"yi FutureProvider ile birleştirebiliriz:

final messagesFamily = FutureProvider.family<Message, String>((ref, id) async {
return dio.get('http://my_api.dev/messages/$id');
});

Daha sonra messagesFamily provider'ımızı kullanarak söz dizimi biraz değiştirildi. Her zamanki sözdizimi artık çalışmayacak:

Widget build(BuildContext context, WidgetRef ref) {
// Hata – messageFamily bir provider değil
final response = ref.watch(messagesFamily);
}

Bunun yerine, messagesFamily'e bir parametre aktarmamız gerekiyor:

Widget build(BuildContext context, WidgetRef ref) {
final response = ref.watch(messagesFamily('id'));
}
bilgi

Farklı parametrelere sahip bir aileyi aynı anda kullanmak mümkündür. Örneğin, Fransızca ve İngilizce çevirileri aynı anda okumak için `titleFamily'i kullanabiliriz:


Widget build(BuildContext context, WidgetRef ref) {
final frenchTitle = ref.watch(titleFamily(const Locale('fr')));
final englishTitle = ref.watch(titleFamily(const Locale('en')));

return Text('fr: $frenchTitle en: $englishTitle');
}

Parametre Kısıtlamaları

Ailelerin doğru çalışması için parametrenin doğru olması önemlidir. provider'a iletilen tutarlı bir hashCode ve == değerine sahiptir.

İdeal olarak, parametre bir ilkel (bool/int/double/String), bir sabit (provider'lar) olmalıdır. veya == ve hashCodeu geçersiz kılan değişmez bir nesne.

Parametre sabit olmadığında autoDisposeu kullanmayı TERCİH EDERİM_:

Bir arama alanının girdisini provider'ına iletmek için aileleri kullanmak isteyebilirsiniz. Ancak bu değer sık ​​sık değişebilir ve bir daha asla kullanılmayabilir. Varsayılan olarak bir provider artık kullanılmasa bile hiçbir zaman yok edilmediğinden, bu durum boşa bellek kullanımına neden olabilir.

Hem .family hem de .autoDisposeun kullanılması bellek sızıntısını düzeltir:

final characters = FutureProvider.autoDispose.family<List<Character>, String>((ref, filter) async {
return fetchCharacters(filter: filter);
});

Bir aileye birden fazla parametre iletin

Ailelerin, birden fazla değeri bir provider'a aktarmaya yönelik yerleşik desteği yoktur.

Öte yandan, bu değer herhangi bir şey olabilir (yukarıda belirtilen kısıtlamalarla eşleştiği sürece).

Bu içerir:

Burada Freezed ve Equatable kullanan bir örnek verilmiştir:


abstract class MyParameter with _$MyParameter {
factory MyParameter({
required int userId,
required Locale locale,
}) = _MyParameter;
}

final exampleProvider = Provider.autoDispose.family<Something, MyParameter>((ref, myParameter) {
print(myParameter.userId);
print(myParameter.locale);
// Kullanıcı kimliği/yerel ayar ile bir şeyler yapın
});


Widget build(BuildContext context, WidgetRef ref) {
int userId; // Kullanıcı kimliğini her yerden oku
final locale = Localizations.localeOf(context);

final something = ref.watch(
exampleProvider(MyParameter(userId: userId, locale: locale)),
);

...
}