• 06-09-2023, 23:06:16
    #1
    Merhabalar basit bir test uygulaması yapıyorum. Öncelikle resim olarak göstereyim.

    Değerli ustalarım örneğin Test 1 girip soruları çözüyorum. Test bittiği zaman doğru ve yanlış sayısını kullanıcıya gösterebiliyorum ve 'Kabul Et' e basarak diğer testlerin olduğu sayfaya yöneldiğimde , ne yaparsam yapayım Doğru ve Yanlış sayısını güncelleyemiyorum. Hep sıfır olarak kalıyor. Bir çok yolu denedim olmuyor. Yapay zeka ile de denedim ÖmerAti hocam da uğraştı konteynerin işlevini yerine getirmediğini söyledi vs. yine yapamadım. Yardımcı olursanız çok sevinirim. Karşılığında yapılması gereken basit iş veya görevleriniz var ise elimden geleni yapabilirim.

    Bu içinde Test 1, Test 2 gibi testlerin bulunduğu sayfa TestSayfasi kodu:

    import 'package:flutter/material.dart';
    import 'main.dart';
    import 'soru_sayfasi.dart';
    import 'test_veri.dart';
    import 'test_veri2.dart';
    import 'mykonteyner.dart';
    
    
    
    
    
    class TestSayfasi extends StatelessWidget {
    @override
      Widget build(BuildContext context) {
    return SafeArea(
    child: Scaffold(
    appBar: AppBar(
    centerTitle: true,
              title: Text('Dilediğin Testi Seç'),
            ),
            body: ListView(
    children: <Widget>[
    for (int i = 1; i <= 20; i++)
    MyWidget(
    child: GestureDetector(
    onTap: () {
    Navigator.push(
    context,
                          MaterialPageRoute(
    builder: (context) => SoruSayfasi(test_1: getTestVeri(i)),
                          ),
                        );
                      },
                      child: Container(
    height: 55,
                        width: double.infinity,
                        decoration: BoxDecoration(
    color: Colors.white,
                          borderRadius: BorderRadius.circular(10),
                        ),
                        child: Stack(
    alignment: Alignment.center,
                          children: [
    Center(
    child: Text(
    'Test $i',
                                style: BilgiTesti.yaldizliYazi,
                              ),
                            ),
                            Positioned(
    top: 5,
                              right: 5,
                              child: Column(
    crossAxisAlignment: CrossAxisAlignment.end,
                                children: [
    Text(
    'Doğru: ${getTestVeri(i).dogruSayisi}',
                                    style: TextStyle(fontSize: 14, color: Colors.green),
                                  ),
                                  Text(
    'Yanlış: ${getTestVeri(i).yanlisSayisi}',
                                    style: TextStyle(fontSize: 14, color: Colors.red),
                                  ),
                                ],
                              ),
                            ),
                          ],
                        ),
                      ),
                    ),
                  ),
              ],
            ),
          ),
        );
      }
    
    TestVeri getTestVeri(int testNumber) {
    switch (testNumber) {
    case 1:
    return TestVeri();
          case 2:
    return TestVeri2();
          case 3:
    return TestVeri();
        // Diğer testler için de aynı şekilde case'ler ekleyebilirsiniz.
          default:
    return TestVeri(); // Varsayılan olarak bir TestVeri nesnesi döndürüyoruz.
        }
    }
    }
    Bu da örneğin Test 1 butonuna tıklandığında karşımıza çıkan , Test bittiğinde AlertDialog içerisinde sonuçları gösterdiğim Soru Sayfası Kodu:

    import 'package:bilgi/Test_Sayfasi.dart';
    import 'package:flutter/material.dart';
    import 'constants.dart';
    import 'test_veri.dart';
    
    class SoruSayfasi extends StatefulWidget {
    final TestVeri test_1;
    
    SoruSayfasi({required this.test_1});
    
    @override
    _SoruSayfasiState createState() => _SoruSayfasiState();
    }
    
    class _SoruSayfasiState extends State<SoruSayfasi> {
    List<Widget> secimler = [];
    
    void butonFonksiyonu(bool secilenButon) {
    if (widget.test_1.testBittiMi()) {
    int dogruSayisi = 0;
    int yanlisSayisi = 0;
    
    for (var secim in secimler) {
    if (secim == kDogruIkonu) {
    dogruSayisi++;
    } else if (secim == kYanlisIkonu) {
    yanlisSayisi++;
    }
    }
    
    showDialog<void>(
    context: context,
    barrierDismissible: false,
    builder: (BuildContext context) {
    return AlertDialog(
    title: Center(
    child: Text(
    'Test Tamamlandı',
    textAlign: TextAlign.center,
    ),
    ),
    content: SingleChildScrollView(
    child: ListBody(
    children: <Widget>[
    Center(
    child: Text(
    'Doğru Sayısı: $dogruSayisi',
    style: TextStyle(fontSize: 22, color: Colors.green),
    ),
    ),
    Center(
    child: Text(
    'Yanlış Sayısı: $yanlisSayisi',
    style: TextStyle(fontSize: 22, color: Colors.red),
    ),
    ),
    SizedBox(height: 20),
    Center(
    child: Text(
    'Başka test çözmek ister misiniz?',
    style: TextStyle(fontSize: 18, color: Colors.black),
    ),
    ),
    ],
    ),
    ),
    actions: <Widget>[
    TextButton(
    child: const Text('Tekrar Dene'),
    onPressed: () {
    Navigator.of(context).pop();
    // Burada testi başa döndüren kodu eklemelisiniz.
    },
    ),
    TextButton(
    child: const Text('Kabul Et'),
    onPressed: () {
    Navigator.pop(context);
    Navigator.pop(
    context,
    MaterialPageRoute(
    builder: (context) => TestSayfasi(),
    ),
    );
    setState(() {
    widget.test_1.testiSifirla();
    secimler = [];
    });
    },
    ),
    ],
    );
    },
    );
    
    
    setState(() {
    widget.test_1.testiSifirla();
    secimler = [];
    });
    } else {
    setState(() {
    secilenButon == widget.test_1.getSoruYaniti()
    ? secimler.add(kDogruIkonu)
    : secimler.add(kYanlisIkonu);
    widget.test_1.sonrakiSoru();
    });
    }
    }
    
    @override
    Widget build(BuildContext context) {
    return SafeArea(
    child: Scaffold(
    appBar: AppBar(
    centerTitle: true,
    title: Text('Test Devam Ediyor..'),
    ),
    backgroundColor: Colors.teal[50],
    body: Column(
    mainAxisAlignment: MainAxisAlignment.spaceBetween,
    crossAxisAlignment: CrossAxisAlignment.stretch,
    children: <Widget>[
    Expanded(
    flex: 4,
    child: Padding(
    padding: EdgeInsets.all(10.0),
    child: Center(
    child: Text(
    widget.test_1.getSoruMetni(),
    textAlign: TextAlign.center,
    style: TextStyle(
    fontSize: 20.0,
    color: Colors.black,
    ),
    ),
    ),
    ),
    ),
    Wrap(
    alignment: WrapAlignment.center,
    spacing: 3,
    runSpacing: 3,
    children: secimler,
    ),
    Expanded(
    flex: 1,
    child: Padding(
    padding: EdgeInsets.symmetric(horizontal: 6.0),
    child: Row(
    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
    children: <Widget>[
    Expanded(
    child: Padding(
    padding: EdgeInsets.symmetric(horizontal: 6),
    child: ElevatedButton(
    style: ElevatedButton.styleFrom(
    padding: EdgeInsets.all(12),
    backgroundColor: Colors.red[400],
    ),
    onPressed: () {
    butonFonksiyonu(false);
    },
    child: Icon(
    Icons.thumb_down,
    size: 30.0,
    color: Colors.white,
    ),
    ),
    ),
    ),
    Expanded(
    child: Padding(
    padding: EdgeInsets.symmetric(horizontal: 6),
    child: ElevatedButton(
    style: ElevatedButton.styleFrom(
    padding: EdgeInsets.all(12),
    backgroundColor: Colors.green[400],
    ),
    onPressed: () {
    butonFonksiyonu(true);
    },
    child: Row(
    mainAxisAlignment: MainAxisAlignment.center,
    children: [
    Icon(
    Icons.thumb_up,
    size: 30.0,
    color: Colors.white,
    ),
    ],
    ),
    ),
    ),
    ),
    ],
    ),
    ),
    ),
    ],
    ),
    ),
    );
    }
    }
    Lazım olurmu bilmiyorum ancak bu da text halinde içine soruları yazdığım TestVeri Sayfası kodum:

    import 'soru.dart';
    
    class TestVeri {
    int dogruSayisi = 0;
      int yanlisSayisi = 0;
      int _soruIndex = 0;
      List<Soru> _soruBankasi = [
    Soru(soruMetni: ',,Hallo!’’ ist eine Begrüßung auf Deutsch.',soruYaniti: true),
        Soru(soruMetni: ',,Tschüss’’ ist eine Verabschiedung auf Deutsch.',soruYaniti: true),
        Soru(soruMetni: ',,Guten Morgen’’ ist eine Verabschiedung auf Deutsch.',soruYaniti: false),
        Soru(soruMetni: ',,Guten Tag’’ ist eine Begrüßung auf Deutsch.',soruYaniti: true),
        Soru(soruMetni: ',,Auf Wiedersehen’’ ist eine Begrüßung auf Deutsch.',soruYaniti: false),
        Soru(soruMetni: ',,Bis später’’ ist eine Verabschiedung auf Deutsch.',soruYaniti: true),
        Soru(soruMetni: ',,Gute Nacht’’ ist eine Verabschiedung auf Deutsch.',soruYaniti: true),
        Soru(soruMetni: ',, :) ’’ Es geht mir gut!',soruYaniti: true),
        Soru(soruMetni: ',, :( ’’ Es geht mir nicht gut!',soruYaniti: true),
        Soru(soruMetni: ',, :/ ’’ Es geht so!',soruYaniti: true),
        Soru(soruMetni: ',, :) ’’ Es geht mir schlecht!',soruYaniti: false),
        Soru(soruMetni: ',, :( ’’ Es geht mir toll!',soruYaniti: false),
        Soru(soruMetni: ',, :) ’’ Es geht mir nicht so gut!',soruYaniti: false),
        Soru(soruMetni: ',, :/ ’’ Nicht schlecht!',soruYaniti: true),
        Soru(soruMetni: ',, :) ’’ Es geht mir super!',soruYaniti: true),
        Soru(soruMetni: ',, :) ’’ Es geht mir sehr gut!',soruYaniti: true),
      ];
    
      String getSoruMetni() {
    return _soruBankasi[_soruIndex].soruMetni;
      }
    
    bool getSoruYaniti() {
    return _soruBankasi[_soruIndex].soruYaniti;
      }
    
    void sonrakiSoru() {
    if (_soruIndex < _soruBankasi.length - 1) _soruIndex++;
      }
    
    bool testBittiMi() {
    if (_soruIndex >= _soruBankasi.length - 1) {
    return true;
        } else {
    return false;
        }
    }
    
    void testiSifirla() {
    _soruIndex = 0;
      }
    
    void dogruCevap() {
    dogruSayisi++;
        sonrakiSoru();
      }
    
    void yanlisCevap() {
    yanlisSayisi++;
        sonrakiSoru();
      }
    }
  • 06-09-2023, 23:12:56
    #2
    State management yöntemlerinden birini kullanabilirsin. Getx öneririm. https://pub.dev/packages/get
  • 07-09-2023, 00:53:04
    #3
    Kodları incelemeden muhtemel çözümü ileteyim, test bittikten sonra backendi güncelliyorsundur diye düşünüyorum ve muhtemelen firebase kullanıyorsundur. Bu güncelleniyorsa gerisi sorun değil, sayfada geriye giderken result ile veri göndermeni ve gelen veriler ile doğru yanlış sayısını güncellemeni öneririm. Navigation result sistemini araştırabilirsin.
  • 07-09-2023, 02:42:04
    #4
    paollu adlı üyeden alıntı: mesajı görüntüle
    State management yöntemlerinden birini kullanabilirsin. Getx öneririm. https://pub.dev/packages/get
    Doğru cevap bu aslında bende mobx öneriririm
  • 07-09-2023, 09:12:29
    #5
    Arkadaşlarında dediği gibi state yönetimi yapman lazım. Eğer günü kurtarmak istiyorsan bana pm at anydeskle bağlanıp çözeyim sorunu. Ancak flutterla uzun vadeli işler yapmayı düşünüyorsan state management konusunu iyi öğrenmelisin.
  • 09-09-2023, 22:31:56
    #6
    Değerli ustalar herkese ayrı ayrı teşekkür ederim önerilerinizden sonra bir sürü yerli yabancı video izleyerek en sonunda provider paketini kullanarak sorunu kökünden çözdüm.
  • 12-09-2023, 13:40:42
    #7
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Getx kütüphanesini kullaranak statemanagement yapmalısın bunu yapmadan değişimleri kayıt etmekte sıkıntı yaşarsın sadece cevap için değil sayfa içi yapılacak buton,navigate vb işlemler içinde statemanagement kullanman gerek başarılar dilerim.