Класс <QuerySnapshot>не имеет получателя экземпляра 'documents'. Получатель: экземпляр 'QuerySnapshot' - PullRequest
0 голосов
/ 02 мая 2020

У меня есть приложение, которое отображает все задачи на экране. Это мой список

class assignedTask extends StatefulWidget {
  static const String id = 'assignedTask';
  @override
  _assignedTaskState createState() => _assignedTaskState();
}

class _assignedTaskState extends State<assignedTask> {
  String Title;
  String Summary;

  var tasks;

  crudMedthods crudObj = new crudMedthods();

  var documentID;
  var documents;



  Future<bool> addDialog(BuildContext context) async {
    return showDialog(
        context: context,
        barrierDismissible: false,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text('Add Data', style: TextStyle(fontSize: 15.0)),
            content: Container(
              height: 125.0,
              width: 150.0,
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  TextField(
                    decoration: InputDecoration(hintText: 'Enter Title'),
                    onChanged: (value) {
                      this.Title = value;
                    },
                  ),
                  SizedBox(height: 5.0),
                  TextField(
                    decoration: InputDecoration(hintText: 'Enter Summary'),
                    onChanged: (value) {
                      this.Summary = value;
                    },
                  ),
                ],
              ),
            ),
            actions: <Widget>[
              FlatButton(
                child: Text('Add'),
                textColor: Colors.blue,
                onPressed: () {
                  Navigator.of(context).pop();
                  crudObj.addData({
                    'Title': this.Title,
                    'Summary': this.Summary
                  }).then((result) {
                    dialogTrigger(context);
                  }).catchError((e) {
                    print(e);
                  });
                },
              )
            ],
          );
        });
  }

  Future<bool> updateDialog(BuildContext context, selectedDoc) async {

    return showDialog(
        context: context,
        barrierDismissible: false,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text('Update Data', style: TextStyle(fontSize: 15.0)),
            content: Container(
              height: 125.0,
              width: 150.0,
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  TextField(
                    decoration: InputDecoration(hintText: 'Title'),
                    onChanged: (value) {
                      this.Title = value;
                    },
                  ),
                  SizedBox(height: 5.0),
                  TextField(
                    decoration: InputDecoration(hintText: 'Enter Summary'),
                    onChanged: (value) {
                      this.Summary = value;
                    },
                  ),
                ],
              ),
            ),
            actions: <Widget>[
              FlatButton(
                child: Text('Update'),
                textColor: Colors.blue,
                onPressed: () {
                  Navigator.of(context).pop();
                  crudObj.updateData(selectedDoc, {
                    'Title': this.Title,
                    'Summary': this.Summary
                  }).then((result) {
                    // dialogTrigger(context);
                  }).catchError((e) {
                    print(e);
                  });
                },
              )
            ],
          );
        });
  }

  Future<bool> dialogTrigger(BuildContext context) async {
    return showDialog(
        context: context,
        barrierDismissible: false,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text('Job Done', style: TextStyle(fontSize: 15.0)),
            content: Text('Added'),
            actions: <Widget>[
              FlatButton(
                child: Text('Alright'),
                textColor: Colors.blue,
                onPressed: () {
                  Navigator.of(context).pop();
                },
              )
            ],
          );
        });
  }

  @override
  void initState() {
    crudObj.getData().then((results) {
      setState(() {
        tasks = results;
      });
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: AppBar(
          title: Text('Assigned Tasks'),
          actions: <Widget>[
            IconButton(
              icon: Icon(Icons.add),
              onPressed: () {
                addDialog(context);
              },
            ),
            IconButton(
              icon: Icon(Icons.refresh),
              onPressed: () {
                crudObj.getData().then((results) {
                  setState(() {
                    tasks = results;
                  });
                });
              },
            )
          ],
        ),
        body: _TaskList(),
    );
  }

  Widget _TaskList() {
    if (tasks != null) {
      return StreamBuilder(
        stream: tasks,
        // ignore: missing_return
        builder: (context, snapshot) {
          if (snapshot.data != null) {
            return ListView.builder(
              itemCount: snapshot.data.documents.length,
              padding: EdgeInsets.all(7.0),
              itemBuilder: (context, i) {
                return  ListTile(
                  title: Text(snapshot.data.documents[i].data["Title"]??""),
                  subtitle: Text(snapshot.data.documents[i].data["Summary"]??""),
                  /*onTap: () {
*//*
                    updateDialog(
                        context, snapshot.data.documents[i].documentID);
                  },*/
                   onTap: (){
                Navigator.push(context,MaterialPageRoute(builder:(context)=>DetailPage(snapshot.data.douments[i])));

              },                     onLongPress: () {
                    crudObj.deleteData(snapshot.data.documents[i].documentID);
                  },
                );
              },
            );

          }
          return CircularProgressIndicator();
        },
      );
    } else {
      return Text('Loading, Please wait..');
    }
  }
}

Когда я нажимаю кнопку ontap, он должен go перейти на страницу сведений, которая отображает детали только этого конкретного задача (примечание: теперь у меня есть только значения Title и summary, позже я добавлю остальные, они должны отобразиться на странице сведений). Мой подробный вид выглядит следующим образом

class DetailPage extends StatelessWidget {
  DocumentSnapshot detailDocument;
  DetailPage(this.detailDocument);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text( detailDocument.data["Title"]),
      ),
      body: Center(
        child: Text(detailDocument.data["Summary"]),
      ),
    );
  }
}

Я получаю сообщение об ошибке NoSuchMethodError было брошено здание Строитель (грязный):

Класс 'QuerySnapshot' не имеет экземпляра 'douments' получателя экземпляра. Получатель: Экземпляр QuerySnapshot. Пробный вызов: douments. Соответствующий виджет, вызывающий ошибки, был: MaterialApp file: /// C: /Users/TRICON/AndroidStudioProjects/taskmanager/lib/main.dart: 21: 14 Когда происходит исключение был брошен, это был стек:

0 Object.noSuchMethod (dart: core-patch / object_patch.dart: 53: 5)

1 _assignedTaskState._TaskList .... (package: TaskManager / экраны / assignedtask.dart: 208: 106)

1 Ответ

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

Вы используете

Navigator.push(context,MaterialPageRoute(builder:(context)=>DetailPage(snapshot.data.douments[i])));

вместо

Navigator.push(context,MaterialPageRoute(builder:(context)=>DetailPage(snapshot.data.documents[i])));

Это просто различие в написании douments как documents.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...