The streamDemo() is not updating the value of doc('$mainDocId') when the value of mainDocId is updated dynamically. I want to update the widget HomeBody() when the document Id is changed dynamically so that I can retrieve the data as per documents selected by users.
I'm using getx as SM. I tried to update the value with update() method but not working.
The codes are as follows.
Controller:
class Controller extends GetxController {
// onInit
@override
void onInit() {
finalNewsModel.bindStream(streamDemo());
super.onInit();
}
// list of document ids.
List docIdList = [
'USA',
'New York',
'Canada',
];
//
RxString mainDocId = 'USA'.obs;
// method to change document id based on docId index.
changeDocId(int index) {
mainDocId(docIdList[index]);
}
//
Rxn<List<NewsModel>> finalNewsModel = Rxn<List<NewsModel>>();
//
List<NewsModel> get newsModelList => finalNewsModel.value;
//
Stream<List<NewsModel>> streamDemo() {
return FirebaseFirestore.instance
.collection('news')
.doc('$mainDocId')
.snapshots()
.map((ds) {
var mapData = ds.data();
List mapList = mapData['list'];
List<NewsModel> modelList = [];
mapList.forEach((element) {
modelList.add(NewsModel.fromMap(element));
});
return modelList;
});
}
}
// UI
class HomeBody extends StatefulWidget {
@override
_HomeBodyState createState() => _HomeBodyState();
}
class _HomeBodyState extends State<HomeBody> {
//
final Controller _controller = Get.put<Controller>(Controller());
@override
Widget build(BuildContext context) {
return Container(
child: Obx(() {
if (_controller.newsModelList == null) {
return Center(
child: Text(
'Please try later!',
));
} else if (_controller.newsModelList.isEmpty) {
return Text('Empty List');
} else {
return ListView.builder(
itemCount: _controller.newsModelList.length,
itemBuilder: (context, index) {
final NewsModel _newsModel = _controller.newsModelList[index];
return MyContainer(
title: _newsModel.title,
titleImage: _newsModel.titleImage,
index: index,
);
},
);
}
}),
);
}
}
BottomNavBar:
bottomNavigationBar: Container(
color: Colors.grey[300],
height: 60.0,
child: Padding(
padding: EdgeInsets.all(8.0),
child: GetBuilder<Controller>(
builder: (context) => ListView.builder(
shrinkWrap: true,
scrollDirection: Axis.horizontal,
itemCount: _controller.docIdList.length,
itemBuilder: (context, index) {
return FavCategoryTags(
tagName: _controller.docIdList[index],
onpress: () =>_controller.changeDocId(index),
);
},
),
),
),
),
Model:
class NewsModel {
String title, titleImage, brief, source;
List aList;
NewsModel({this.title, this.titleImage, this.brief, this.aList, this.source});
factory NewsModel.fromMap(dynamic fieldData) {
return NewsModel(
title: fieldData['title'],
titleImage: fieldData['titleImage'],
brief: fieldData['brief'],
aList: fieldData['mediaDescList'],
source: fieldData['source'],
);
}
}