• Yardım
  • Hata : type 'Future<dynamic>' is not a subtype of type 'int'

Best score’u ayrı bir yerde tutmak istiyorum. Shared preferences kullanamayı denedim ancak hata alıyorum.

import 'package:shared_preferences/shared_preferences.dart';

int best;

setBest(int n) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setInt('best', n);
}

getBest() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  int intValue = prefs.getInt('best');
  if (intValue == null) {
    return 0;
  }
  return intValue;
}` 

Bu dart dosyasını başka bir dart dosyasında  import .... as x olarak cagırıyorum.
O sayfanın kodu.
`int best = x.getBest();

@override
  void initState() {
    super.initState();
    if (score > best) {
      best = score;
      x.setBest(score);
    }
  }

Buda hata mesajı.
Exception caught by widgets library
The following _TypeError was thrown building Builder:
type 'Future<dynamic>' is not a subtype of type 'int'
The relevant error-causing widget was MaterialApp lib\main.dart:9
When the exception was thrown, this was the stack
#0 new _QuizResultState package:quiz_game/pages/quiz_result.dart:16
#1 QuizResult.createState package:quiz_game/pages/quiz_result.dart:12
#2 new StatefulElement package:flutter/…/widgets/framework.dart:4591
#3 StatefulWidget.createElement package:flutter/…/widgets/framework.dart:894
Normal element mounting (115 frames)

Abd MErhaba,
shared preferences’i yanlış kullanıyırsunuz hocam.

addIntToSF() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setInt('intValue', 123);
}

Burada intValue değişkenine 123 değeri verildi.
bunu başka yerde çağırmak için :

SharedPreferences prefs = await SharedPreferences.getInstance();
  //Return int
  int intValue = prefs.getInt('intValue');
  • Abd replied to this.

    Flutter
    Kodu yazarken baktığım yerlerden biride burasıydı. Tam olarak neresi hatalı anlamadım. Nereyi değistirmem gerekiyor?
    getBestte best degiskenini intValueye atayıp onu return ediyorum. Sanırım. 🙂

    Abd

    getBest() async {
      SharedPreferences prefs = await SharedPreferences.getInstance();
      int intValue = prefs.getInt('best');
      if (intValue == null) {
        return 0;
      }
      return intValue;
    }

    yerine

    getBest() async {
      SharedPreferences prefs = await SharedPreferences.getInstance();
      prefs.setInt('best', 123);
      int intValue = prefs.getInt('best');
      if (intValue == null) {
        return 0;
      }
      return intValue;
    }

    kullanmayı deneyin hocam

    • Abd replied to this.

      getBest() async bir metot olarak tanımlamışsınız.
      int best = x.getBest();
      yerine
      int best = await x.getBest();
      kullanmalısınız

      • Abd replied to this.

        HseyinAkkaya await yazdığımda hata veriyor. The await expression can only be used in an async function. diyor

        Abd Hocam random atamayın
        123 yerine kullanıcıdan aldığınız değeri yazmanız kafigelecektir.

        • Abd replied to this.

          Abd initState içinde await kullanamazsınız. Bunun yerine kodlarınızı yeni bir metoda taşıyın ve initState içinde bu metodu çağırın.

          HseyinAkkaya
          int best = x.getBest(); Bu kısım init dışında zaten ve await ekleyemiyorum.

          @override
          void initState() {
          super.initState();
          if (score > best) {
          best = score;
          x.setBest(score);
          }
          }


            Flutter Hocam ben best = getBest diyerek kullanıcının en iyi skorunu alıyorum. get’in içinde set koyarsam kullanının quiz çözüp bir score alması gerekir ki kullanayım ama istatistkler sayfamda bu getBest’i içinde set ile kullanamam ki. En son ki değeri neyse en iyi skorun onu alıp ekrana yazdırıyorum.

            Abd
            Sanırım ben ne yapmak istediğinizi anlamadım.
            Siz shared preference’yi ne için kullanıyorsunuz ?
            normal kullanım amacı dışında kullanıyorsuuz galiba ?
            önce bunu anlamam gerek

            • Abd replied to this.

              Flutter Bir tane quiz uygulaması yapıyorum. Kullanıcı quizi çözüyor. Bitince başka sayfaya(sonuç sayfası) doğru-yanlış sayısını taşıyorum. Bu sayfada bu kadar doğrun var bu kadar yanlışın var diyorum ve en iyi skorunu gösteriyorum. Birde istatistikler sayfası var kullanıcın genel istatistiklerini gösterdiğim. Toplam çözülen soru, toplam doğru sayısı vs.
              Bu tür verileri saklamak ve uygulama açılıp kapandığında bu değerleri kaybetmemek için shared preferences kullanmak gerekiyormuş sanırım. Bir dart dosyası açıp bu değişkenleri içinde tanımlayıp get, setlerini yazdım. Bu sayfayı import … as x diye başka sayfalarda çağırıp best = x.getBest() gibi kullandığımda dediğim hatayı alıyorum.

              Abd
              GetBeet methodunu await ile kullanmadığın sürece hata almaya devam edeceksin. Çünkü getbest async bir methot. Geriye int değil Future<int> dönüyor. Ayrıca class içinde doğrudan metot çağıramazsın.

                Abd
                Şu yapıyı bir dene
                `
                int best =0;

                @override
                void initState() {
                super.initState();
                _getbest();
                }


                _getbest() async {
                best= await x.getBest();
                if (score > best) {
                best = score;
                await x.setBest(score);
                }
                }
                `

                • Abd replied to this.

                  HseyinAkkaya int best = 0; yüzünden hep best 0 olarak kalıyor.
                  if ile kontrol ettikten sonraki best = score çalışmıyor. Ekranda hep 0 olarak gözüküyor. int best; yaptığımda da hep null oluyor. 🙂

                  Abd
                  Oraya bir de setstate yazsan sonucu ekranda da görecen de işte 😄
                  En iyisi ben sana proje oluşturup yazayım göndereyüm sıfırdan 😄

                  • Abd replied to this.

                    Abd Hocam shardepreference yanlış çözüm.
                    sqflite kullanmanızı tavsiye ederim. Sayfalar arası veri taşıması içinde shared preference ile yapmanız ekstra iş yükü bindirir.
                    Bu işlemi aşağıdaki gibi yapabilrsiniz.
                    Verinin olduğu sayfadan diğer sayfayı açmaya çalışırken:

                    Navigator.push(
                              context,
                              MaterialPageRoute(
                                  builder: (context) => YeniSayfa(scor)));

                    verinin kullanılacağı sayfa:

                    
                    class YeniSayfaextends StatefulWidget {
                      final String scor;//if you have multiple values add here
                    YeniSayfa(this.scor, {Key key}): super(key: key);//add also..example this.abc,this...
                    
                      @override
                      State<StatefulWidget> createState() => _PasswordPageState();
                    }
                    
                    class _PasswordPageState extends State<PasswordRoute> {
                     @override
                      Widget build(BuildContext context) {
                    ...child: Text(widget.scor);
                    }
                    }
                    • Abd replied to this.

                      HseyinAkkaya setstate aklıma geldi, denemiştim ve değişen bir şey olmadı. 😄 sqflite deneyeceğim artık. 😃

                        Flutter Shared preferences daha kolay gözüktüğü için onu kullanmak istedim hızlı sonuç almak için. Artık sqflite deneyeceğim yapacak bir şey kalmadı. 😄 sqflite her türlü öğrenilmesi gereken bir şey zaten bahaneyle öğrenmiş olurum. 😃