#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. спасибо за помощь. Я уже получил ответ, как его передать