Flutter FutureBuilder return null - PullRequest
       5

Flutter FutureBuilder return null

0 голосов
/ 27 мая 2020

при перечислении данных в моей локальной базе данных с моментальным снимком FutureBuilder возвращает значение null. Я не перечисляю свои данные. когда я проверяю статус подключения, он ждет. при отладке метода dbHelper.randevuListesiGetir () моя консоль прослушивания данных screnn, но не прослушивает futurebuilder.

enter image description here

class _RandevularState extends State<Randevular> {
  DatabaseHelper dbHelper;
  List<Randevu> tumRandevular;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();

      dbHelper=DatabaseHelper();
     tumRandevular=List<Randevu>();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future:dbHelper.randevuListesiGetir() ,
      builder: (context,AsyncSnapshot<List<Randevu>> snapshot){
        if(snapshot.connectionState==ConnectionState.done){
          tumRandevular=snapshot.data;
          print("data"+snapshot.data.toString());
        }else if(snapshot.connectionState==ConnectionState.waiting){
          print("waiting");
        }else{
          print("error");
        }

      },
    );
  }

}

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

эти методы в классе databasehelper

  Future<List<Map<String,dynamic>>> randevuGetir() async {
    var db = await _getDatabase();
    var sonuc = await db.query("randevu");
    print("sonuc:$sonuc");
    return sonuc;
  }

  Future<List<Randevu>> randevuListesiGetir() async {
    var randevuMapListesi = await randevuGetir();
    var randevuListesi = List<Randevu>();
    for(Map map in randevuMapListesi){
      randevuListesi.add(Randevu.fromMap(map));
    }
    print(randevuListesi);
    return randevuListesi;

  }

эти коды моя рандевулярная страница

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:kuaforapp/models/musteri.dart';
import 'package:kuaforapp/models/randevu.dart';
import 'package:kuaforapp/utils/database_helper.dart';

class Randevular extends StatefulWidget {
  @override
  _RandevularState createState() => _RandevularState();
}

class _RandevularState extends State<Randevular> {
  List<Randevu> tumRAndevular;
  DatabaseHelper databaseHelper;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    tumRAndevular = List<Randevu>();
    databaseHelper = DatabaseHelper();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: databaseHelper.randevuListesiGetir(),
      builder: (context, AsyncSnapshot<List<Randevu>> snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          tumRAndevular = snapshot.data;
          return ListView.builder(
              itemCount: tumRAndevular.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(tumRAndevular[index].randevuId.toString()),
                );
              });
        } else {
          return Center(
            child: CircularProgressIndicator(),
          );
        }
      },
    );
  }
}

enter image description here

0 голосов
/ 27 мая 2020

Что касается вашего вопроса, вам необходимо проверить, есть ли в вашем снимке данные, прежде чем пытаться что-либо сделать с snapshot.data. В конце у меня есть пара советов.

import 'package:flutter/material.dart';

class _RandevularState extends State<Randevular> {
  DatabaseHelper dbHelper;
  List<Randevu> tumRandevular;
  Future<List<Randevu>> randevuFuture;

  @override
  void initState() {
    super.initState();
    dbHelper = DatabaseHelper();
    randevuFuture = dbHelper.randevuListesiGetir();
    tumRandevular = List<Randevu>();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: randevuFuture,
      builder: (context, AsyncSnapshot<List<Randevu>> snapshot) {
        if (snapshot.hasData) {
          print("Data: ${snapshot.data}");
          final randevuList = snapshot.data;
          return ListView.builder(
              itemCount: randevuList.length,
              itemBuilder: (context, index) {
                final currentRandevu = randevuList[index];
                return ListTile(
                  title: Text("${currentRandevu.name}"),
                );
              });
        }
        // Also check for possible errors
        if (snapshot.hasError) {
          print("An error occurred");
          return Text("An error occurred");
        }
        // You probably want to show loading indicator before you have data
        return CircularProgressIndicator();
      },
    );
  }
}
  • Это метод компоновщика, вы должны вернуть виджет из него. в будущем: часть. Поскольку вы даете вызов функции в future:, FutureBuilder будет вызывать это в каждой сборке.
...