Merhaba! Flutter 'da benzer görünen işlevlerin farklarını irdelemeye yönelik bir seri oluşturmaya karar verdim. Sizin de aklınıza takılan "Bunlar aynı değil mi? Ne farkları var ki?" diye düşündüren konuları yorum yapın birlikte araştırıp öğrenelim 😀
Bölüm 1 😀
Navigator.pop(context); ve Navigator.of(context).pop(); arasındaki fark nedir?
Her iki yöntemde mevcut rotayı yığından çıkararak bir önceki rotayı gösterir iki method arasındaki tek fark of() static methodudur. Of() static methodu verilen context'i kapsayan bu sınıfın en yakın örneğinin(instance) durumunu verir.
Navigator.of(context) methodunun Navigator widget'ına doğrudan bir referansı yoktur ve rotalar üzerinde işlem yapabilmek için verilen BuildContext'in en yakın atası olan Navigator'ı kullanır. Bu, özellikle iç içe rotalarla çalışırken veya Navigator widget ağacında birkaç seviye yukarıdayken yararlı olabilir.
Navigator.pop(context) yöntemi ise, çağrıldığı yerde geçerli olan BuildContext nesnesini kullanarak Navigator sınıfının bir örneğini elde eder ve bu örneği kullanarak yönlendirme işlemlerini gerçekleştirir.
Navigator widget'ına doğrudan referansınız olmadığında (Bu Navigator iç içe rotalarla çalışıyorsanız ve Navigator'a doğrudan erişilemiyorsa olabilir.) Bu durumlarda, verilen BuildContext'in en yakın atası olan Navigator'ı elde etmek için Navigator.of(context) yöntemini kullanabilirsiniz.
Bu örnekte, MyWidget widget'ının Navigator widget'ına doğrudan bir referansı yoktur. Navigator, MaterialApp widget'ının içinde, widget ağacının birkaç seviye yukarısındadır. Navigator.of(context) methodu sayesinde verilen BuildContext'in en yakın atası Navigator'ı elde edebilirsiniz:
import 'package:flutter/material.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('My App'),
),
body: Center(
child: MyWidget(),
),
);
}
}
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('My Widget'),
),
body: Center(
child: TextButton(
onPressed: () {
// Burada navigator widget'ına doğrudan bir referansınız yoktur
},
child: const Text('Go to another screen'),
),
),
);
}
}
Kaynaklar:
https://api.flutter.dev/flutter/widgets/Navigator/of.html
https://api.flutter.dev/flutter/widgets/Navigator-class.html
https://stackoverflow.com/a/71616934/14745090
Top comments (2)
Selamlar. Öncelikle başladığın bu seri için teşekkürler. Faydalı bir iş olacağı kesin. Fakat düzeltme ihtiyacı hissettiğim bir şey var.
DM kapalı olduğu için burdan belirtiyorum ki:
Bu bilgi yanıltıcı ve kafa karıştırıcı olabilir. Zira "(1) Navigator.of(context).someMethod()" ile "(2) Navigator.someMethod(context)" arasında hiçbir işlevsel fark yok. Biri instance method, diğeri static method. Birinde instance a ulaşmak için of(BuildContext) metodunu kullanıyoruz, diğerinde static method aynı "of" metodunu kullanarak instance a ulaşıp gerekli metodu çağırıyor.
Instance a ulaşmak için context i kullanıyoruz ve 1. Örnekte of ile Navigator instance'ına ulaşırken ikincide o static metod ulaştığı için BuildContext i ona veriyoruz.
Dilersen kaynak kodlarına bakabilirsin.
Cevabınız için çok teşekkür ederim. Biraz daha araştırıp güncelleyeceğim 😀