Список Firebase не обновляется в установленном состоянии - PullRequest
0 голосов
/ 20 декабря 2018

Функция Flutter setState не обновляет список после получения из Firebase.

Я пытаюсь разработать приложение Flutter.Я не получаю обновления списка в функции setState ().Список успешно извлекается из firebase.Я записал соединения Firebase в файл Services.dart.

Но мой метод _getList() не позволяет получить значение в файле main.dart.

main.dart

    class DetailsPageState extends State<DetailsPage> {

    List<Product> list;

        @override
    void initState() {
        _checkUser();  // for getting user id from firebase auth
    }

        @override
    Widget build(BuildContext context) {
            return new Scaffold(
                body: new Container(
                    child:new Text("data");
                );
            )
    }

    void _checkUser(){
        debugPrint("Entering in _checkUser");
        this.firebaseAuth.onAuthStateChanged.listen((firebaseUser)async{
            _getList(firebaseUser.uid);
        });
    }


    void _getList(String id)
    debugPrint("Entering in _getList");
        Services.retrieveItems(firestore, uid).then((onValue){
                setState(() {
                    list=onValue;
                        debugPrint("items list:"+onValue.length.toString());
                        debugPrint("items list:"+listCart.length.toString());
                });
        });
        }
    }

Services.dart

    static Future<List> retrieveItems(Firestore firestore, String userId) async {
        List<Product> items = new List<Product>();
        try {
        firestore.collection("Items").document(userId)
        .collection("ItemsMain").snapshots().listen((QuerySnapshot snapshot)  {
            List docList = snapshot.documents;
            items = snapshot.documents.map((documentSnapshot) => Product.fromMap(documentSnapshot.data)).toList();
            debugPrint("items:"+items.length.toString());
            //return items;
        });
        } on Exception catch (e) {
        print (e.toString());
        }

        debugPrint("items 2:"+items.length.toString());
        return items;
    }

Ожидаемые результаты:

Вход в _checkUser

Вход в _getList

элементы: 6

элементы 2: 6

элементы списка: 6

элементы списка: 6

Фактические результаты:

Вход в _checkUser

Вход в _getList

список элементов: 0

список элементов: 0

предметов 2: 0

предметов: 6

1 Ответ

0 голосов
/ 20 декабря 2018

Вы возвращаете товары до их загрузки.Самый простой способ исправить это - использовать await в retrieveItems для ожидания загрузки данных из Firestore:

static Future<List> retrieveItems(Firestore firestore, String userId) async {
    List<Product> items = new List<Product>();
    var snapshot = await firestore.collection("Items").document(userId)
                                  .collection("ItemsMain").getDocuments()
    List docList = snapshot.documents;
    items = snapshot.documents.map((documentSnapshot) => Product.fromMap(documentSnapshot.data)).toList();
    debugPrint("items:"+items.length.toString());

    return items;
}

Вы заметите, что я:

  • Звоните get() вместо listen().Поскольку listen() начинает активный мониторинг коллекции, невозможно сказать, когда она «сделана».A get(), с другой стороны, возвращает документы один раз, а затем выполняется.
  • Удалена обработка исключений, просто чтобы сделать код немного более читабельным.Но я также рекомендую добавлять обработчики исключений в функциональный код, как это, если вы действительно обрабатываете исключение.Оставьте обработчики «log and continue» для кода более высокого уровня, такого как ваш метод main.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...