[当应显示来自Firestore的数据时列表显示为空

问题描述 投票:0回答:2

我想搜索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();
  }
}
firebase flutter google-cloud-firestore full-text-search flutter-test
2个回答
0
投票

我将分享我在一个有相同问题的项目中所做的工作。我尝试了许多方法,但所有方法都以null结束。然后,我在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();
    });
  }

0
投票

这是我的问题的答案我应该在onPressed中使用await

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();}}
© www.soinside.com 2019 - 2024. All rights reserved.