【发布时间】:2020-11-19 14:15:00
【问题描述】:
我想在调用提供程序函数时查看更新列表项。但它不起作用。
在将普通视图更改为FutureBuilder 之前,它起作用了。我尝试改用StreamBuilder,也不起作用。
我该如何解决这个问题?
这里是提供者:
class SelectArtistProvider extends ChangeNotifier {
List<Map> artists = [];
...
Future initArtistListVM() async { //for Future Builder
var allArtists =
await Firestore.instance.collection('artists').getDocuments();
List list = allArtists.documents
.map((artist) => {
'id': artist.documentID,
'name': artist.data['name'],
'image': "artist.data['image'],
'selected': "false",
})
.toList();
artists = list;
notifyListeners();
return artists;
}
void toggleSelected(Map item, int index) {
artists[index]['selected'] = !item['selected'];
notifyListeners();
}
查看
// list view
class SelectArtist extends StatelessWidget {
Widget build(BuildContext context) {
final selectArtistProvider = Provider.of<SelectArtistProvider>(context);
return FutureBuilder(
future: selectArtistProvider.initArtistListVM(), // initial data from api
builder: (context, snapshot) {
return ListView.builder(
...
child: ArtistItem(index, selectArtistProvider.artists[index])
// item view
class ArtistItem extends StatelessWidget {
final int index;
final Map artist;
Widget build(BuildContext context) {
final selectArtistProvider = Provider.of<SelectArtistProvider>(context);
return GestureDetector(
onTap: () => selectArtistProvider.toggleSelected(artist, index),
child:
...
Visibility(
visible: artist['selected'],
child: SomeWidget()
...
// root view to place providers
class InitialProviders extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
...
ChangeNotifierProvider(create: (_) => SelectArtistProvider()),
],
child: ...
【问题讨论】:
-
我注意到,每当 ArtistItem 调用
toggleSelected()时都会调用FutureBuilder,因此每次toggleSelected()更新artists时都会覆盖artists。我能为它做些什么?
标签: flutter stream future flutter-provider flutter-listview