• Yardım
  • ürünlerin otomatik olarak detay sayfalarına gidemiyorum

merhabalar. benim elimde ürün olarak 4 farklı okul projesi var. bunların her birinin kendi bilgileri var. ben bu projeleri listeledim. bunlara tıkladığımda da her birinin ayrı detay sayfasına gitmek istiyorum. hatta bir proje eklediğimde de onun otomatik olarak detay sayfasının oluşmasını istiyorum. detay sayfalarının şablonu hep aynı. o yüzden kopyala yapıştır ile her bir projenin ayrı ayrı detay sayfasını elle oluşturup onlara ayrı ayrı Navigator ile giderek uygulamanın boyutunu gereksiz büyütmek istemiyorum. anlattığım durumu e ticaret uygulaması şeklinde yapılmışı var ama onlar veri tabanı kullanmışlar. veri tabanı kullanmadan bunu yapmanın bir yolu var mı? ilgili kodları aşağıya bırakıyorum.


class ProjeDetaySayfasi extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return ProjeDetaySayfasiState();
  }
}

enum Secenek { Sil, Guncelle }

class ProjeDetaySayfasiState extends State {
  final _formKey = GlobalKey<FormState>();
  String unvan;
  File _secilenresim;
  //final picker = ImagePicker();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        leading: Icon(Icons.pageview),
        title: Text("ŞEHİT BAYRAM YEŞİL ÇPAL"),
        actions: <Widget>[
          PopupMenuButton<Secenek>(
              onSelected: islemSec,
              itemBuilder: (BuildContext) => <PopupMenuEntry<Secenek>>[
                PopupMenuItem(
                    value: Secenek.Guncelle,
                    child: Text("BİLGİLERİ GÜNCELLE")),
                PopupMenuItem(
                    value: Secenek.Sil,
                    child: Text("BİLGİLERİ SİL"))
              ])
        ],
      ),
      body: Container(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Container(
              child: Align(
                alignment: Alignment.topCenter,
                child: SingleChildScrollView(
                  physics: ClampingScrollPhysics(),
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: <Widget>[
                      Container(height: 150, width: double.maxFinite,
                        child: _secilenresim == null ? Image(
                          image: AssetImage("assets/okullogo.png"),
                        )
                            : Image.file(_secilenresim),
                      ),
                      SizedBox(width: 380, height: 25,
                        child: RaisedButton(
                            child: Text("Galeriden Proje resmini değiştirmek için tıklayın"),
                            onPressed: () {
                              galeriden_yukleme();
                            }),
                      ),
                      Divider(height: 10.0, color: Colors.white,)
                    ],
                  ),
                ),
              ),
            ),
            Expanded(child: ListView.builder(
              itemCount: AtaWidget.of(context).proje_BilgiTablosuBaslik.length,
              itemBuilder: (context, index)=>ListTile(
                 leading: Icon(Icons.details),
                 title: Text(AtaWidget.of(context).proje_BilgiTablosuBaslik[index], style: TextStyle(
                     color: Colors.blueGrey, fontSize: 15, fontStyle: FontStyle.italic, fontWeight: FontWeight.w500),),
                subtitle: Text(AtaWidget.of(context).proje_BilgiTablosuGiris[index],
                  style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold, color: Colors.black),),
                onLongPress: (){
                   if(AtaWidget.of(context).kullaniciadi == "ömer kalfa"){

                     TextEditingController kontrol = TextEditingController();
                     showDialog(
                       context: context,
                       builder: (BuildContext context){
                        return Form(
                            key: _formKey,
                            child: Container(
                              padding: EdgeInsets.only(right: 10, left: 10, top: 0, bottom: 250),
                              child: Align(
                                alignment: Alignment.topCenter,
                                child: SingleChildScrollView(
                                  physics: ClampingScrollPhysics(),
                                  child: AlertDialog(
                                    title: Text(AtaWidget.of(context).proje_BilgiTablasuGuncelle[index]),
                                    content: Column(
                                      mainAxisAlignment: MainAxisAlignment.start,
                                      children: <Widget>[
                                        ListTile(
                                          leading: Icon(
                                            Icons.announcement,
                                            color: Colors.red,
                                          ),
                                          title: Text("Güncellemelerinizi bitirdikten sonra lütfen sayfanın alt tarafındaki KAYDET"
                                              "butonuna tıklayarak güncellemelerinizi kaydediniz. Aksi takdirde değişiklikler kaybolacaktır.",
                                              style: TextStyle(fontSize: 15, fontWeight: FontWeight.w500)),
                                        ),
                                        TextFormField(
                                          controller: kontrol,
                                          decoration: InputDecoration(
                                            labelText: AtaWidget.of(context).proje_BilTabGunGiris[index],
                                            labelStyle: TextStyle(color: Colors.purple),
                                          ),
                                          style: TextStyle(fontStyle: FontStyle.italic, fontSize: 17,),
                                        ),
                                      ],
                                    ),
                                    actions: <Widget>[
                                      MaterialButton(
                                          color: Colors.blue,
                                          child: Text("Güncelle"),
                                          onPressed: (){
                                            _formKey.currentState.save();
                                            print(kontrol.text);
                                            setState(() {
                                              AtaWidget.of(context).proje_BilgiTablosuGiris[index]=kontrol.text;
                                              kontrol.clear();
                                              Navigator.pop(context);
                                            });
                                          })
                                    ],
                                  ),
                                ),
                              ),
                            ));
                       }
                     );
                   }
                },
            ),
            )
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          anasayfayaGit();
        },
        child: Icon(Icons.home),
        tooltip: "Anasayfaya Dön",
      ),
    );
  }

  void islemSec(Secenek secenek) async {
    int sonuc;
    switch (secenek) {
      case Secenek.Guncelle:
        if (AtaWidget.of(context).kullaniciadi == "ömer kalfa"){

          AlertDialog alertDialog =
          new AlertDialog(title: Text("Güncellenecek alana uzun basarak işleme devam edebilirsiniz."));
          showDialog(context: context, builder: (_) => alertDialog);


        } else {
          AlertDialog alertDialog =
          new AlertDialog(title: Text("Hata: "), content: Text(" İşlemi yapmaya yetkiniz yok"),);
          showDialog(context: context, builder: (_) => alertDialog);
        }
        break;
      default:
    }

  }

  Future galeriden_yukleme() async {
    if (AtaWidget.of(context).kullaniciadi == "ömer kalfa"){
      var resim = await ImagePicker.pickImage(source: ImageSource.gallery);
      setState(() {
        _secilenresim = resim;
      });
    }else{AlertDialog alertDialog =
    new AlertDialog(title: Text("Hata: "), content: Text(" İşlemi yapmaya yetkiniz yok"),);
    showDialog(context: context, builder: (_) => alertDialog);}
  }

  void anasayfayaGit() async {
    bool sonuc = await Navigator.push(
        context, MaterialPageRoute(builder: (context) => Anasayfa()));
  }

}

    buda kodlarımın devamı.
    `class AtaWidget extends InheritedWidget{

    //GİRİŞ VE KAYDOL İÇİN
    String kullaniciadi;
    String sifre;

    //PROJEDETAY EKRANI İÇİN
    List<String> okul_proje = [“Meslek Liseleri Hayata Dokunuyor Projesi ”,“FOR MY HEALTH eTwinning Projesi”,
    “GÜNDEMİN ÖGELERİ eTwinninng Projesi ”,“CLİMATE VOLUNTEERS eTwinning Projesi”,];

    //PROJE DETAY SAYFASI EKRANI İÇİN
    List<String> proje_BilgiTablosuBaslik =[“ proje adı:”,“ danışman öğretmen(ler):”,“ öğrenciler:”,“ açıklama:”,“ iletişim:”];
    List<String> proje_BilgiTablosuGiris = [“a”,“b”,“c”,“d”,“e”];
    List<String> proje_BilgiTablasuGuncelle = [“Proje Adını Güncelleme”,“Danışman Öğretmen(ler)i Güncelleme”,“Öğrencileri Güncelleme”,
    “Açıklamayı Güncelleme”,“İletişim Bilgileri Güncelleme”];
    List<String> proje_BilTabGunGiris = [“Proje adını giriniz”, “Danışman öğretmen(ler)i giriniz”, “Öğrencileri giriniz”, “Açıklama giriniz”,
    “İletişim bilgilerini giriniz”];

    AtaWidget({
    Key key,
    @required Widget child,
    this.sifre,
    this.kullaniciadi,
    }) : super (key : key, child: child);

    static AtaWidget of (BuildContext context){
    return context.inheritFromWidgetOfExactType(AtaWidget);
    }

    @override
    bool updateShouldNotify(InheritedWidget oldWidget) {
    return true;
    }

    }
    `

    Veritabanı kullanmadan herbir okulun verisini tutacak bir alanın olması lazım. Büyük veri değil ise Okul adında bir model oluştur. O modele göre her okulun verilerini kaydet. Sonra onları bir ekrana listele. Onlardan birine tıkladığında başka bir sayfa açılacak o sayfaya tıkladığın okul objesini Detay sayfasına gönder. Detay sayfasında istediğin gibi kullan…

    Örnek:

    import 'package:flutter/material.dart';
    
    class Okul {
      final int index;
      final String okulAdi;
    
      Okul(this.index, this.okulAdi);
    }
    
    List<Okul> okullar = [
      Okul(0, "Okul 1"),
      Okul(1, "Okul 2"),
    ];
    
    class Okulla extends StatefulWidget {
      @override
      _OkullaState createState() => _OkullaState();
    }
    
    class _OkullaState extends State<Okulla> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: ListView.builder(
            itemCount: okullar.length,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text(okullar[index].okulAdi),
                leading: IconButton(
                  icon: Icon(Icons.arrow_forward_ios),
                  onPressed: () {
                    Navigator.push(
                        context,
                        MaterialPageRoute(
                            builder: (BuildContext context) =>
                                Detay(okul: okullar[index])));
                  },
                ),
              );
            },
          ),
        );
      }
    }
    
    class Detay extends StatefulWidget {
      final Okul okul;
    
      const Detay({Key key, this.okul}) : super(key: key);
      @override
      _DetayState createState() => _DetayState();
    }
    
    class _DetayState extends State<Detay> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: Text(widget.okul.okulAdi),
          ),
        );
      }
    }

    kalfalarinOmer verileri json olarak tutabilirsiniz. Daha sonra json decode ile list<proje> gibi bir listeye dönüştürüp kullanabilirsiniz. Sayfada proje class tipinde veri alır ve ekranda gösterir

    SerdarPolat hocam okulları listelemedi.
    The getter ‘length’ was called on null. Receiver : null
    hatası verdi. Zaten Tahminim ilk ListView.builder in altındaki itemCount: okullar.length yazidigmda tanimamisti. Ben onu
    List<Okul> okullar;
    Diyerek tanıttım ama sanırım local aldığından null döndü üstte yazılan listeyi görmedi.

    kalfalarinOmer tamam hocam tamam ya ben o listeyi Okul classinin içine atmışım. Ondan görmemiş. Valla eğer burada Textformfield ile alan güncellemesi de yapabilirsem tadından yenmez.

    HseyinAkkaya evet onu biliyorum. Adım adım gitmek istediğim için şu anlik daha veritabanı işine girişmedim. Daha yeniyim adım adım ilerlemek istiyorum. Oraya da gelecem inşallah hocam.

      SerdarPolat hocam senin bu yazdığın kodu kendiminkine uyarladım. yapmak istediğim projelerin detay sayfalarına gittiğinde 5 tane listTile sıralaması ve her birinin içine sırayla proje adı, danışman öğretmen, öğrenci, açıklama ve iletişim bilgileri yazması aslında.

      `class proDetSayTab {

      int index; String projeTabloBaslik;
      String projeAdi;
      String projeDanismani;
      String ogrenciler;
      String projeAciklama;
      String projeIletisim;

      proDetSayTab(this.index, this.projeTabloBaslik, this.projeAdi, this.projeDanismani, this.ogrenciler, this.projeAciklama, this.projeIletisim);

      }

      List<proDetSayTab> proDetSayTablosu = [
      proDetSayTab(0,“proje adı:”, “Meslek Liseleri Hayata Dokunuyor Projesi”, “Emsal Dönmez Akın”, “a,b,c,x”, “xxxxxxxx”, “xxxxx@gmail.com”),
      proDetSayTab(1,“danışman öğretmen(ler):”, “FOR MY HEALTH eTwinning Projesi”, “Emsal Dönmez Akın”, “bbbbb”, “yyyyy”, “yyyyyy@gmail.com”),
      proDetSayTab(2,“öğrenciler:”, “GÜNDEMİN ÖGELERİ eTwinninng Projesi”, “ömer”, “ddddd”, “zzzzz”, “zzzzz@gmail.com”),
      proDetSayTab(3,“proje açıklama:”, “CLİMATE VOLUNTEERS eTwinning Projesi”, “ayşe”, “eeee”, “tttt”, “ttttt@gmail.com”),
      proDetSayTab(4,“proje iletişim:”, “Yeni Proje”, "", “eeee”, “tttt”, “ttttt@gmail.com”),
      ];`

      burada kendim senin okul alanına benzer bir alan oluşturdum. burada detay sayfasının koduna proDetSayTablosu[index].projeTabloBaslik dediğmde ListView.builder içinde oluşturduğum listTile ın title’ ına yukarıda yazdığım tabloların başlıkları yukarıdan aşağıya oluşuyor tam istediğim gibi. yalnız işte benim bu ListTile’ın subtitle’ ına bu gelmesini istediğim bilgiler proDetSayTab() fonksiyonunun hep farklı kategorilerinde bulunuyor. mesela title proje adı olan kısmın subtitle’ ı proje adı olacak. title’ ı danışman olan kısmın subtitle’ ı proje adı değil danışman adı olacak. title’ ı mesela iletişim olan kısmın subtitle’ ı xxxx@gmail.com olacak. bu tablodaki bilgilerin yanlamasına ilerlemesi gerekiyor anlayacağın.

      kalfalarinOmer projelerin detay sayfalarının kodu da şu şekilde. aşağıya çıktının görüntüsünün linkini atıcam.

      `class ProjeninDetaySayfasi extends StatefulWidget {
      proDetSayTab proje;
      ProjeninDetaySayfasi({Key key, this.proje}): super(key: key);
      @override
      State<StatefulWidget> createState() {
      return ProjeninDetaySayfasiState();
      }
      }

      class ProjeninDetaySayfasiState extends State {

      final _formKey = GlobalKey<FormState>();
      String unvan;
      File _secilenresim;

      //final picker = ImagePicker();
      @override
      Widget build(BuildContext context) {
      return Scaffold(…..
      body: Container(
      Expanded(child: ListView.builder(
      itemCount: proDetSayTablosu.length,
      itemBuilder: (context, index)=>
      ListTile(
      leading: Icon(Icons.details),
      title: Text(proDetSayTablosu[index].projeTabloBaslik, style: TextStyle(
      color: Colors.blueGrey, fontSize: 15, fontStyle: FontStyle.italic, fontWeight: FontWeight.w500),),
      subtitle: Text(proDetSayTablosu[index].projeAdi,
      style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold, color: Colors.black),),
      onLongPress: (){
      if(AtaWidget.of(context).kullaniciadi == “ömer kalfa”){

                      TextEditingController kontrol = TextEditingController();
                      showDialog(
                          context: context,
                          builder: (BuildContext context){
                            return Form(
                                key: _formKey,
                                child: Container(
                                  padding: EdgeInsets.only(right: 10, left: 10, top: 0, bottom: 250),
                                  child: Align(
                                    alignment: Alignment.topCenter,
                                    child: SingleChildScrollView(
                                      physics: ClampingScrollPhysics(),
                                      child: AlertDialog(
                                        title: Text(proDetSayTablosu[index].projeAdi),
                                        content: Column(
                                          mainAxisAlignment: MainAxisAlignment.start,
                                          children: <Widget>[
                                            ListTile(
                                              leading: Icon(
                                                Icons.announcement,
                                                color: Colors.red,
                                              ),
                                              title: Text("Güncellemelerinizi bitirdikten",
                                                  style: TextStyle(fontSize: 15, fontWeight: FontWeight.w500)),
                                            ),
                                            TextFormField(
                                              controller: kontrol,
                                              decoration: InputDecoration(
                                                labelText: proDetSayTablosu[index].projeAdi,
                                                labelStyle: TextStyle(color: Colors.purple),
                                              ),
                                              style: TextStyle(fontStyle: FontStyle.italic, fontSize: 17,),
                                            ),
                                          ],
                                        ),
                                        actions: <Widget>[
                                          MaterialButton(
                                              color: Colors.blue,
                                              child: Text("Güncelle"),
                                              onPressed: (){
                                                _formKey.currentState.save();
                                                print(kontrol.text);
                                                setState(() {
                                                  proDetSayTablosu[index].projeAdi=kontrol.text;
                                                  kontrol.clear();
                                                  Navigator.pop(context);
                                                });
                                              })
                                        ],
                                      ),
                                    ),
                                  ),
                                ));
                          }
                      );
                    }
                  },
                ),
              )
              )
            ],
          ),
        ),

      `

      kalfalarinOmer https://drive.google.com/file/d/1s-XTYyP_rUDSUXZAalPlWOtBiiGwYDJZ/view?usp=drivesdk
      Bu da ematördeki çıktı. Farklı kategorilere dediğim gibi hep proje adları geldi. Danışman koysaydim da hep danışman adları gelecekti. Farklı kategorilere onlarla alakalı bilgilerin gelmesi için ne yapmam gerekiyor? Valla ne zamandır buna kafa patlatıyorum olmuyor. En sonunda amele gibi her projenin detay sayfasını kopyala yapıştır ile manuel yapıcam. Bu konuda yardımcı olabilirseniz çok mutlu olurum. Şimdiden teşekkürler.

      kalfalarinOmer hocam yapıyı biraz yanlış kurmuşsunuz. Listeyi indexle dönerek yanlış verileri ekrana yazıyorsunuz çünkü liste biraz garip olmuş. Bir projenin tüm bilgilerini bir class tutabilmeli.
      Proje adında bi class oluşturun. İçinde
      Proje adı
      Danışman
      Öğrenciler
      Danışman maili
      Vs vs olsun..
      Detay sayfası tüm listeyi değil listenin 1 elemanını almalı. Örneğin a projesinin detayı gibi.

      Bir sayfada sadece proje başlıklarını listeleyin.
      List<proje> projeler =…
      Şeklinde listeyi oluşturun.
      A projesi
      B projesi şeklinde ekranda gösterin.
      Projesinin üzerine tıklandığında detay sayfasına projeler[index] değerini gönderin.
      Detay safası tek bir proje alsın. Listtile içinde
      Title:text(“Proje adı”),
      Subtitle:text(proje.projeAdi)
      Bu şekilde kullanın.

      HseyinAkkaya hocam yapmak istediğim de tam olarak o aslında. Projeleri listelemek, listelenen projelerin otomatik olarak kendi sayfasını oluşması ve orayı yönetmek. Yaklaşık 1 haftadır uğraşıyorum, araştırdım, kafa patlattım ama olmadı. Siz buna benzer örnek varsa link paylaşırsanız yada bira daha detaylı anlatırsanız çok sevinirim. Çok da sık kullanılan bir şey o yüzden yapıyı anlamak istiyorum.

      HseyinAkkaya hocam sizin dediğiniz nasıl bir şey? dediğiniz gibi yapmaya çalıştığmda hep önceki denemelere gidiyor. biraz daha detaylı anlatsanız? yada basit bir örnek ile gösterseniz?

        Write a Reply...