В списке отображается значение null, когда должны отображаться данные из хранилища огня - PullRequest
0 голосов
/ 08 мая 2020

Я хочу выполнить поиск в данных firestore, но список не показывает мне данные из firestore. Я хочу вернуть свой список с данными firestore, но он не отображается, и я хочу выполнить поиск в данных списка по своему выбору.

Скажите, пожалуйста, где я ошибаюсь?

class serachDeligat extends SearchDelegate<String> {
  Firestore _firestore = Firestore.instance;
  String ref = 'items';

  Future<List<DocumentSnapshot>> getSearch() async =>
      await _firestore.collection(ref).getDocuments().then((snaps) {
        return snaps.documents;
      });
  List<Map> search = <Map>[];
  Future getDocs() async {
    search = await (await getSearch()).map((item) => item.data).toList();
    return search;
  }

  @override
  void initState() {
    getDocs();
  }

  @override
  List<Widget> buildActions(BuildContext context) {
    // TODO: implement buildActions
    return [
      IconButton(
        icon: Icon(Icons.clear),
        onPressed: () {
          print('$search');
        },
      ),
    ];
  }

  @override
  Widget buildLeading(BuildContext context) {
    // TODO: implement buildLeading
    return IconButton(
      icon: Icon(Icons.arrow_back),
      onPressed: () {
        close(context, null);
      },
    );
  }

  @override
  Widget buildResults(BuildContext context) {
    return Container(
      child: Center(),
    );
  }

  @override
  Widget buildSuggestions(BuildContext context) {
    return Container();
  }
}

Ответы [ 2 ]

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

вот ответ на мой вопрос, я должен использовать ожидание в моем onPressed

class serachDeligat extends SearchDelegate<String>{
  Firestore _firestore = Firestore.instance;
  String ref = 'items';
  Future<List<DocumentSnapshot>> getSearch() async =>
      await _firestore.collection(ref).getDocuments().then((snaps) {
        return snaps.documents;
      });
  List<Map> search = <Map>[];
  Future getDocs() async {
    search=await
        (await getSearch()).map((item) => item.data).toList();
    return search;}
  @override
  void initState() {
    getDocs();
    super.query;
  }
  List<Map> searchAi = <Map>[];
  @override
  List<Widget> buildActions(BuildContext context) {
    // TODO: implement buildActions
    return[IconButton(
      icon: Icon(Icons.clear),
      onPressed: ()async {
        searchAi=await getDocs();

        print(searchAi);

      },),];}

  @override
  Widget buildLeading(BuildContext context) {
    // TODO: implement buildLeading
    return IconButton(
      icon: Icon(Icons.arrow_back),
      onPressed: (){
        close(context, null);
      },
    );
  }

  @override
  Widget buildResults(BuildContext context) {

    return Container(
      child: Center(),);}

  @override
  Widget buildSuggestions(BuildContext context) {
    return Container();}}
0 голосов
/ 08 мая 2020

Я поделюсь тем, что я сделал в одном из моих проектов, в котором была такая же проблема. Я пробовал много способов, но все они заканчивались нулевым значением. Затем я изменяю свою функцию с помощью StreamSubscription. Это изменит данные даже после получения из firestore, поскольку он поддерживает соединение с firestore. Я загрузил данные в initstate.

  StreamSubscription<QuerySnapshot> dailyTaskSubscription;
  ProgressDialog progressDialog;
  List<ScheduleTask> mondayTaskList = List();
  @override
  void initState() {
    super.initState();
      mondayTaskList = List();
      dailyTaskSubscription?.cancel();
      dailyTaskSubscription = scheduleService
          .getDailyTaskList(studentId, 'monday')
          .listen((QuerySnapshot snapshot) {
        final List<ScheduleTask> tasks = snapshot.documents
            .map((documentSnapshot) =>
                ScheduleTask.fromMap(documentSnapshot.data))
            .toList();
    });
  }
...