【问题标题】:Flutter View does not update view while Provider call notifyListeners()Provider 调用 notifyListeners() 时 Flutter View 不更新视图
【发布时间】: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


【解决方案1】:

解决了这个问题!

更改initArtistListVM() 的某些部分。

if (artists.isEmpty) {
    artists = list;
    notifyListeners();
}

【讨论】:

    猜你喜欢
    • 2021-03-09
    • 2021-11-07
    • 1970-01-01
    • 2020-07-16
    • 2021-12-23
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多