@HseyinAkkaya
Hocam şu awaitler hata veriyor. await sadece async fonksiyonlarla kullanılabiliyor diyor ama fonksiyonlar async zaten.
List<Food> foods = await db.allFoods();
Food aFood = await db.getFood(1);
Food aFood2 = await db.getFoodbyName(“Mercimek Çorbası”);

Abd await kullandığınız metot da async olmalı. nerede kullandığınızı da atar mısınız

  • Abd likes this.
  • Abd replied to this.

    Abd initstate async olamaz. Bunu yerine async metot oluşturup initstate içinde await olmadan bu metodu çağırın. Scaffold içinde gelen data== null ise progressbar gösterin else kısmında da ekranınızı tasarlayın.

    @HseyinAkkaya
    Hocam tekrar rahatsız ediyorum. 🙂
    Telefon ekranında type Future<dynamic> is not a subtype of type List<Food> yazıyor.
    Konsolda mainde ki MaterialApp için hataya neden oldu tarzı bir şey yazıyor.

    main dosyam
    void main() {
    runApp(MyApp());
    }
    class MyAppextends StatelessWidget {
    @override
    Widget build(BuildContext context) {
    return MaterialApp(initialRoute: '/', routes: {
    '/': (context) => Home(),
    ...

    food ve database kodları tamamen aynı.
    bu da database’i kullandığım sayfa.

    `FoodDatabase db = FoodDatabase();
    Food iFood =Food(name: “Salata”,recipe: “Doğra karıştır”,ingredients: “Domates biber soğan”);

    void ekle() async {
    Food aFood2 = await db.getFoodbyName(“Mercimek Çorbası”);
    aFood2.name=“Lahmacun”;
    db.foodUpdate(aFood2);
    }

    allFoods() async {
    return await db.allFoods();
    }

    @override
    void initState() {
    super.initState();
    db.insertFood(iFood);
    List<Food> foods = allFoods();
    print(foods[0]);
    ekle();
    foods = allFoods();
    print(foods[1]);
    …`

    İlk kod düzgün ikincisi niye tırnak içinde olmasına rağmen düzelmedi anlamadım valla 🙂

    Abd allFoods(); async metod. başına await yazarak kullanmalısınız. ayrıca initstate içinde await kullanamazsınız. await kullanmadığınız için liste değil future dönüyor ve future nesneyi list içine atmaya çalışıyorsunuz. await kullanın ama bunu initstate dışında yapın.

    • Abd replied to this.

      HseyinAkkaya
      FoodDatabase db = FoodDatabase();
      Food iFood =Food(name: “Salata”,recipe: “Doğra karıştır”,ingredients: “Domates biber soğan”);
      Bu ilk iki satır initState dışında.
      db.insertFood(iFood);
      Bu satır initState dışında the name of a constructor must match the name of the enclosing class diye hata veriyor.
      initState içinde kullandığımda altında bir hata çıkmıyor. Üstelik async olmasına rağmen awaitsiz kullanıyoruz. awaitle kullanılmıyor zaten. initState içinde ki haliyle kodu çalıştırınca bir yerde hata fırlatıyor ayrıca ama onu tam anlayamadım. 🙂

      Benim amacım uygulama açıldığında databaseye sadece bir tane Food eklemek ve daha sonra bu Food’un değerleriyle oynamak. İkinci bir food eklemeyeceğim. Bunu nasıl yapabilirim? Database’i nerede oluşturup, bu foodu nerede nasıl insert etmem gerekiyor? 🙂

        8 months later

        HseyinAkkaya Hüseyin bey merhaba, hemen hemen aynı yapıya sahip soru cevap uygulamam mevcut. uygulama ilk kurulumda localDB oluşturuyor. kullanıcılar veritabanından gelen soru ve cevaplara göre soru cevaplayıp, doğru yanlış cevapları görebiliyor, sonuç kısmında da cevap anahtarı ekranı görüyorlar. aşağı yukarı uygulama çalışma mantığı bu.

        asıl sormak istediğim ise şu. uygulamamın 500 tane kullanıcısı var. play storedan indirdiler kullanıyorlar. ancak ben ilerleyen süreç ile birlikte uygulamamın veritabanına yeni sorular ekleyip güncelleme vermek istiyorum. ancak sorun şu ki uygulama kurulu olan kullanıcılar güncelleme yapınca yeni eklenen soruları göremiyorlar. uygulama kaldırılıp yeniden kurulursa db olmadığı için yeniden db oluşturuluyor ve tüm soruları görebiliyorlar tabi. ama var olan DB yi güncelleme ile yenisi ile değiştiremiyorum. bu durum ile ilgili bana yardımcı olabilir misiniz? örnek bir kod bloğunuz var mı acaba bu durum ile ilgili. şimdiden teşekkürler.

        Madlove Bunu basit olarak şu şekilde yapabilirsiniz. Veritabanına birde versiyon numarası atın. Normalde sqflite ile veritabanı oluştururken bir versiyon numarası atıyordu ama ne kadar tutarlı çalışır tartışılır. Siz bir tabloda bunu tutabilirsiniz. Veritabanı yoksa zaten oluşturuluyor bunda sıkıntı yok. Ama veritabanı halihazırda varsa bir if sorgusu ile güncel olup olmadığını öğrenebilirsiniz. Program içinde bu versiyonu sorgularsınız. Eğer versiyon numarası daha önceden eklenmemişse veya şuanki versiyondan küçükse sorular tablosunu silip güncel sorularla yeniden oluşturun ve versiyon tablosundaki değeri güncelleyin. Eğer versiyon tablosu yoksa onu da güncel değer ile oluşturun.
        Bu şekilde sorularda değişiklik yaparak yayınladığınız her sürümde db versiyonunu 1 artırarak telefonun bunu algılamasını sağlamış olursunuz. Hatta versiyonu tablo yerine shared_preferences ile de tutabilirsiniz. versiyon null veya şimdikinden küçükse işlem yapabilirsiniz.

        Write a Reply...