Здесь я использую поток List<DocumentSnapshot> Я мало что знаю о своем потоке. Я подумал, что мы можем использовать потоки для разбивки на страницы во Flutter, поскольку он загружается при изменении данных. Я думал, что все прошло так, как ожидалось, пока отладка, когда я отлаживаю, показывает исключение, в котором говорится, что поток был вызван с нулевым значением, и я не знаю, где это пошло не так, также не знаю, что код правильный, но код предназначен для тех случаев, когда пользователь прокручивает до конца, новый список захватывается и добавляется в поток. В соответствии с моей ошибкой я поместил состояние инициализации, чтобы убедиться, что поток не равен нулю, и это дает мне ошибку
class _Articles extends StatefulWidget {
@override
_ArticlesState createState() {
return new _ArticlesState();
}
}
class _ArticlesState extends State<_Articles> {
final firestore = Firestore.instance;
ScrollController controller;
StreamController<List<DocumentSnapshot>> list;
String s;
@override
void initState() {
controller = ScrollController()..addListener(_listen);
addlist(); // this is to enure the stream should not be null
super.initState();
}
@override
void dispose() {
list.close();
controller.removeListener(_listen);
super.dispose();
}
_listen() { // to check user end of the list or not
if (controller.offset >= controller.position.maxScrollExtent &&
!controller.position.outOfRange) {
listadd(); // if end of the list add to stream
}
}
@override
Widget build(BuildContext context) {
var height = MediaQuery.of(context).size.height;
var width = MediaQuery.of(context).size.width;
return Container(
padding: EdgeInsets.only(top: 10, bottom: 10),
color: Colors.grey[100],
child: StreamBuilder<List<DocumentSnapshot>>(
stream: list.stream,
builder: (context, snapshot) {
return //some widget like listview builder with data in snapshot
}),
);
}
void addlist() async{
QuerySnapshot list1= await Firestore.instance.collection('articles').limit(3).orderBy('title').getDocuments();
list.add(list1.documents);
s= list1.documents[2].data['title'];
}
void listadd() async{
QuerySnapshot li= await Firestore.instance.collection('articles').orderBy('title').limit(3).startAt([s]).getDocuments();
list.add(li.documents);
s=li.documents[2].data['title'];
}
}
выше мой код не знаю, как передать это просто след и ошибка, что, если сам код неверен, пожалуйста, исправьте меня, любая помощь приветствуется.
list, похоже, не инициализирован должным образом, поскольку addlist() не запускался как асинхронный, то есть addlist().whenComplete(). Фрагмент ниже соответствует cloud_firestore 2.2.0
Здесь вы можете просто добавить QuerySnapshot в виде потока.
child: StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore.instance
.collection('articles')
.orderBy('title')
.limit(3)
.snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
return //some widget like listview builder with data in snapshot
},
),
Похоже, что поле
listникогда не инициализируется. Попробуйте заменить текущее объявление неинициализированного поля наfinal list = StreamController<List<DocumentSnapshot>>();