I'm trying to retrieve a stream List of NewsModel from cloud firestore but ultimately failing. Codes and images are as follows.
I have a collection 'news' > document 'USA' > field list. // list is an array which contains list of map. I want to retrieve this list.
How can I retrieve data from firebase, store in the model object and use the model for UI?
Error:
The following NoSuchMethodError was thrown building:
The method '[]' was called on null.
Receiver: null
Tried calling: [](0)
Code are as follow:
Model:
class NewsModel {
String title, titleImage, brief;
List aList;
NewsModel({this.title, this.titleImage, this.brief, this.aList});
factory NewsModel.fromMap(dynamic fieldData) {
return NewsModel(
title: fieldData['title'],
titleImage: fieldData['titleImage'],
brief: fieldData['brief'],
aList: fieldData['mediaDescList']);
}
}
Controller:
class Controller extends GetxController {
// onInit
@override
void onInit() {
finalNewsModel.bindStream(streamDemo());
fetchDocs();
super.onInit();
}
//
Rxn<List<NewsModel>> finalNewsModel = Rxn<List<NewsModel>>();
//
List<NewsModel> get newsModelList => finalNewsModel.value;
//
Stream<List<NewsModel>> streamDemo() {
return FirebaseFirestore.instance
.collection('news')
.doc('USA')
.snapshots()
.map((ds) {
var mapData = ds.data();
List mapList = mapData['list'];
List<NewsModel> newsModelList = [];
mapList.forEach((element) {
newsModelList.add(NewsModel.fromMap(element));
});
return newsModelList;
});
}
}
UI:
class HomeBody extends StatefulWidget {
@override
_HomeBodyState createState() => _HomeBodyState();
}
class _HomeBodyState extends State<HomeBody> {
//
final _controller = Get.put(Controller());
//
NewsModel _newsModel = NewsModel();
@override
Widget build(BuildContext context) {
return Container(
child: GetBuilder<Controller>(builder: (_controller) {
if (_controller.newsModelList == null) {
return Text('Loading');
} else if (_controller.newsModelList.isEmpty) {
return Text('Empty List');
} else {
return ListView.builder(
itemCount: _controller.newsModelList.length,
itemBuilder: (context, index) {
return MyContainer(
title: _newsModel.title[index],
titleImage: _newsModel.titleImage[index],
);
},
);
}
}),
);
}
}