Alt sınıftan ana sınıftaki bottombar'ı değiştirme
İşte nasıl yenileyeceğim sayfayı?
Denedim hocam maalesef sonuç aynı.
Sadece true veya false'u mu değiştireceksiniz hocam ?
Konunuza benzer internetten bir örnek atar mısınız
- Edited
Hocam daha net anlatmak için iki farklı kod paylaşayım.
Bir sınıfın scaffold gövdesine farklı bir sınıf atayıp ilerleyince appbar veya bottomappbar gibi nesneleri güncelleyemiyorum. Daha doğrusu yöntemi bilmiyorum.
Örnek ;
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
bool bottomNavDurum = true;
@override
Widget build(BuildContext context) {
debugPrint(bottomNavDurum.toString());
return Scaffold(
appBar: AppBar(
title: Text("Home Page"),
backgroundColor: Colors.red,
),
body: SecondPageClass(),
bottomNavigationBar: bottomNavDurum
? BottomAppBar(
child:
Container(height: 50, child: Text("Custom Bottom Bar 1")),
color: Colors.red)
: BottomAppBar(
child:
Container(height: 50, child: Text("Custom Bottom Bar 2")),
color: Colors.yellowAccent));
}
barDegisim(){
setState(() {
bottomNavDurum = false;
});
}
}
class SecondPageClass extends StatefulWidget {
@override
_SecondPageClassState createState() => _SecondPageClassState();
}
class _SecondPageClassState extends State<SecondPageClass> {
@override
Widget build(BuildContext context) {
return Center(
child: Container(
child: RaisedButton(
child: Text("Button"),
color: Colors.orange,
onPressed: () {
_HomePageState().barDegisim();
}),
),
);
}
}
Fakat ilk sınıfın scaffold gövdesine yine aynı sınıftan devam edersem appbar, bottomappbar vb. nesneleri güncelleyebiliyorum.
Örnek,
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
bool bottomNavDurum = true;
@override
Widget build(BuildContext context) {
debugPrint(bottomNavDurum.toString());
return Scaffold(
appBar: AppBar(
title: Text("Home Page"),
backgroundColor: Colors.red,
),
body: secondPageMetod(),
bottomNavigationBar: bottomNavDurum
? BottomAppBar(
child:
Container(height: 50, child: Text("Custom Bottom Bar 1")),
color: Colors.red)
: BottomAppBar(
child:
Container(height: 50, child: Text("Custom Bottom Bar 2")),
color: Colors.yellowAccent));
}
secondPageMetod(){
return Center(
child: Container(
child: RaisedButton(
child: Text("Button"),
color: Colors.orange,
onPressed: () {
barDegisim();
}),
),
);
}
barDegisim(){
setState(() {
bottomNavDurum = false;
});
}
}
katre bottomNavDurum = true; veya false olacak anladığım kadarıyla ?
Eğer böyleyse değiştirememenizin neden Bool bottomNavDurum = true; olarak tanımladığını yerin yanlış olması.
class _HomePageState extends State<HomePage> {
bool bottomNavDurum = true;
@override
Widget build(BuildContext context) {
debugPrint(bottomNavDurum.toString());
yerine
bool bottomNavDurum = true;
class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
debugPrint(bottomNavDurum.toString());
gib yer değişitirirseniz düzelir.
Tahmin etmiştim ama siz appbar dediğinizde akıma scaffold altındaki appbar geldi. BottomAppBar değil.
Hocam öncelikle şunda hem fikir olalım.
Mesele true/false meselesi değil.
Bakın üsteki iki kod örneğinden body kısmında yeni sınıf kullandığım kod bloğu ile hata alıyorum. İkinci paylaştığım kod bloğunda sınıf içinden ayrılmadığım yapıda sorun yok.
Şunu anlamaya çalışıyorum. Sınıf içinde sınıf kullanırken önceki sınıfta tanımlı sabit ekranda değerleri oluşmuş appbar, bottomappbar vb. nesneleri değiştirmek için değer gönderme yöntemi nedir? Benim uyguladığım yöntem doğru mu?
Nasıl ulaşacağım ilk sınıfa?
Yöntem : _HomePageState().barDegisim()
Ayrıca son gönderdiğiniz yapıyı denedim.
Sonuç :
I/flutter ( 4922): The setter 'bottomNavDurum=' was called on null.
I/flutter ( 4922): Receiver: null
I/flutter ( 4922): Tried calling: bottomNavDurum=false
- Edited
Selamlar, yeni üye oldum, şansıma denk geldi, bir yıldır flutter kullanmama rağmen kusura bakmayın ingilizce cevaplayacağım. Flutter çalışma mantığı açısından diğer dillere çok benzer ancak oop yapısı compile time ile runtime arasında farklıdır, runtime durumunda kullandığınız variable fieldları widget build methodu dışında yazarsanız ve instantiate yapmazsanız bu yapının build fonksiyonu dışında ramde kapladığı alan oluşmaz, yani null kalır. Ürettiğiniz fieldlara erişmek istiyorsanız iki yolunuz var, ya global bir key kullanacaksınız ki bu flutter stable sürüme geçtiğinden beri deprecated oldu, ya da fieldları fonksiyon dışında tanımlayıp constructor yoluyla yeniden create edeceksiniz.
Subfly’ın cevabına ek olarak state management mimarileri kullanmak daha rahat olur. provider
ve bloc
gibi.
Merhaba, @Subfly, @neuraminidase7 cevaplarınız için teşekkürler.
Bende soruyu sorduğum gün araştırmaya devam ederken constructor yoluyla olabileceğini öğrenip sorunumu halletmiştim. Hatta proje büyüdükçe, sınıflar çoğaldıkça widget tree’de constructor karmaşası yaşanıp işin içinden çıkılamayacağı için asıl olması gereken yöntemin de @neuraminidase7′ın önerdiği state management yöntemlerinden birini uygulamak gerektiğini öğrendim. İş yoğunluğum nedeniyle foruma geri dönüp yöntemler ile ilgili cevap yazmaya vakit bulamamıştım maalesef.