Flutter:`notifyListeners`不更新列表

Posted

技术标签:

【中文标题】Flutter:`notifyListeners`不更新列表【英文标题】:Flutter: `notifyListeners` not updating the list 【发布时间】:2019-11-13 14:00:36 【问题描述】:

我正在尝试在我的应用中列出产品类别,并且我正在使用提供程序包进行状态管理。在构建期间它显示列表是空的,即使它不是,然后我添加一个点击事件来更新列表它工作的时间。 我在初始屏幕期间调用getAllCategories() 函数,vallCategoryList 具有值。

这是我的分类类

class Category with ChangeNotifier

  int catId;
  String catName;
  String catThumbnail;

  List<SetCategory> allCategoryList = [];


void  getAllCategories() async 
    String categoryUrl = 'https://app.ecwid.com/api/ccccccc';

    Response allCategory = await get(categoryUrl);

    print('getAllCategories');


    if (allCategory.statusCode == 200) 
      var categoryData = allCategory.body;

      int totalcount = jsonDecode(categoryData)['count'];

      if (allCategoryList.length != totalcount) 
        allCategoryList.clear();

        for (int i = 0; i < totalcount; i++) 
          allCategoryList.add(SetCategory(
            catId: jsonDecode(categoryData)['items'][i]['id'],
            catName: jsonDecode(categoryData)['items'][i]['name'],
            catThumbnail: jsonDecode(categoryData)['items'][i]['thumbnailUrl'],
          ));

        

      
    
    print('allcategorylist length $allCategoryList.length');

    notifyListeners();
  





class SetCategory 

  int catId;
  String catName;
  String catThumbnail;

  SetCategory(
       this.catId, this.catName, this.catThumbnail);


我的屏幕代码

class HomeScreen extends StatefulWidget 
  static const String id = 'homeScreen';
//  static int reload = 0;



  @override
  _HomeScreenState createState() => _HomeScreenState();


class _HomeScreenState extends State<HomeScreen> 
 @override
  Widget build(BuildContext context) 

      final category = Provider.of<Category>(context);

    print('category length $category.allCategoryList.length'); // here it shows length as 0 even though it has a value of 16.

    return Row(
                children: <Widget>[
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text(
                      'Category $category.allCategoryList.length',
                      style: TextStyle(
                        color: Colors.black,
                        fontWeight: FontWeight.bold,
                        fontSize: 15.0,
                      ),
                      textAlign: TextAlign.start,
                    ),
                  ),

                  InkWell(
                                      onTap: () 

                                        category.getAllCategories();  // when i tap here this updates the list
                                        ),
                ],
              ),

【问题讨论】:

【参考方案1】:

您是否在 Widget 中使用了ChangeNotifierProvider,如图所示here

如果您只是使用Provider,它不会更新,而只是让后代可以访问该对象

【讨论】:

是的,我将它添加到 main.dart 文件中,就像这样 Widget build(BuildContext context) return ChangeNotifierProvider&lt;Category&gt;( builder: (context)=&gt;Category(), child: MaterialApp( initialRoute: customsplash.SplashScreen.id, routes: customsplash.SplashScreen.id: (context)=&gt;customsplash.SplashScreen(), HomeScreen.id: (context)=&gt;HomeScreen(), ,),);【参考方案2】:

通过添加Consumer解决,改成这样的代码

child: Consumer<Category>(
                        builder: (_,category,__)
                          return ListView.builder();

【讨论】:

以上是关于Flutter:`notifyListeners`不更新列表的主要内容,如果未能解决你的问题,请参考以下文章

在 deactivate() 中调用 notifyListeners() 会导致错误 - Flutter

Provider 调用 notifyListeners() 时 Flutter View 不更新视图

notifyListeners() 不向 UI 返回数据

为啥 notifyListeners() 不更新消费者?

消费者未使用 notifyListeners() 进行更新

提供者 NotifyListeners 不更新消费者