Flutter Navigator — Как передать список в качестве параметра на другую страницу?

#flutter #parameter-passing #navigator #stream-builder

#flutter #передача параметров #навигатор #stream-builder

Вопрос:

Я могу считывать данные из firestore и отображать данные в listview, который является ListOfTaskNotApprove. Затем я хочу передать ListDocumentSnapshot в navigator.push на страницу EditListTask для редактирования задачи. Я получил сообщение об ошибке , в котором говорилось , что данные равны нулю . вот мой код.

ListOfTaskNotApprove.дротик.

 import 'package:carousel_pro/carousel_pro.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:fyp/screen/RecordOfficer/EditListTask.dart';
import 'package:fyp/shared/Loading.dart';
import 'package:google_fonts/google_fonts.dart';


class ListOfTaskNotAccepted extends StatefulWidget {
  @override
  _ListOfTaskNotAcceptedState createState() => _ListOfTaskNotAcceptedState();
}
final FirebaseAuth auth = FirebaseAuth.instance;
Stream<QuerySnapshot> getUser(BuildContext context) async* {
  final FirebaseUser rd = await auth.currentUser();
  yield* Firestore.instance.collection("Task").where('uid',isEqualTo: rd.uid).where("verified", isEqualTo: 'TidakSah').snapshots();
}
class _ListOfTaskNotAcceptedState extends State<ListOfTaskNotAccepted> {
  List<NetworkImage> _listOfImages = <NetworkImage>[];
  String comments;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Aduan Tidak Diterima"),
          backgroundColor: Colors.redAccent,
        ),
      body: Container(
      child: StreamBuilder(
          stream: getUser(context),
          builder: (context, snapshot){
            if (snapshot.hasError || !snapshot.hasData) {
              return Loading();
            } else{
              return ListView.builder(
                  itemCount: snapshot.data.documents.length,
                  itemBuilder: (BuildContext context, int index){
                    final List<DocumentSnapshot> da = snapshot.data.documents;
                    _listOfImages =[];
                    for(int i =0; i <snapshot.data.documents[index].data['url'].length; i  ){
                      _listOfImages.add(NetworkImage(snapshot.data.documents[index].data['url'][i]));
                    }
                    return Card(
                        child:ListTile(
                          title: Container(
                            alignment: Alignment.centerLeft,
                            child: Column(
                              children: <Widget>[
                                SizedBox(height: 5.0),
                                Container(alignment: Alignment.centerLeft,
                                  child: Text(da[index].data['sumberAduan'], style: GoogleFonts.asap(fontWeight: FontWeight.bold)),
                                ),
                                SizedBox(height: 5.0),
                                Container(alignment: Alignment.centerLeft,
                                  child: Text(da[index].data['noAduan'], style: GoogleFonts.lato(fontWeight: FontWeight.bold)),
                                ),
                                SizedBox(height: 5.0),
                                Container(alignment: Alignment.centerLeft,
                                  child: Text(da[index].data['kategori'], style: GoogleFonts.arimo(fontWeight: FontWeight.w500)),
                                ),
                                SizedBox(height: 5.0),
                                Container(alignment: Alignment.centerLeft,
                                  child: Text(da[index].data['verified'], style: GoogleFonts.asap(fontWeight: FontWeight.bold)),
                                ),
                                Column(
                                  children: [
                                    Container(
                                      margin: EdgeInsets.all(10.0),
                                      height: 200,
                                      decoration: BoxDecoration(
                                          color: Colors.white
                                      ),
                                      width: MediaQuery.of(context).size.width,
                                      child: Carousel(
                                        boxFit: BoxFit.cover,
                                        images: _listOfImages,
                                        autoplay: false,
                                        indicatorBgPadding: 5.0,
                                        dotPosition: DotPosition.bottomCenter,
                                        animationCurve: Curves.fastLinearToSlowEaseIn,
                                        animationDuration: Duration(milliseconds: 2000),
                                      ),
                                    )
                                  ],
                                )
                              ],
                            ),
                          ),
                          subtitle: Container(
                          child: Row(
                            children: [
                              SizedBox(height: 5.0),
                              Container(alignment: Alignment.centerLeft,
                                child: Text(da[index].data['comments'], style: GoogleFonts.arimo(fontWeight: FontWeight.w500)),
                              ),
                            ],
                          ),
                        ),
                          onTap: (){
                            Navigator.push(context, MaterialPageRoute(builder: (context) => EditListTask(da: snapshot.data.documents[index]),
                              ));
                          },
                        )
                    );
                  });
               }
          }),
       )
    );
  }

}
 

EditTaskPage- это таблица, в которую я хочу передать данные из ListOfTaskNotApprove.dart.

Редактировать страницу задачи.dart

 import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class EditListTask extends StatefulWidget {
  final DocumentSnapshot da;

  EditListTask({Key key, this.da}) : super(key: key);


  @override
  _EditListTaskState createState() => _EditListTaskState(da);
}


class _EditListTaskState extends State<EditListTask> {
  DocumentSnapshot da;
  _EditListTaskState(DocumentSnapshot da){
     this.da = da;
  }

  @override
  Widget build(BuildContext context) {
    final  String noAduan = widget.da.data['noAduan'];
    return Container(
      child: Text("$noAduan")
    );
  }
}
 

Я получил ошибку, подобную этой.

 Class 'QuerySnapshot' has no instance method '[]'.
Receiver: Instance of 'QuerySnapshot'
Tried calling: [](0)
The relevant error-causing widget was: 
  EditListTask file:///D:/Android_project/fyp/lib/screen/RecordOfficer/ListOfTaskNotAccepted.dart:102:93
When the exception was thrown, this was the stack: 
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
#1      _EditListTaskState.build (package:fyp/screen/RecordOfficer/EditListTask.dart:23:39)
 

Это потому, что я передаю список documentsnapshot?
Как решить эту проблему? кто-нибудь мне поможет?

Комментарии:

1. flutter.dev/docs/cookbook/navigation/navigate-with-arguments

2. спасибо за помощь. Я уже получил ответ, как его передать