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<Category>( builder: (context)=>Category(), child: MaterialApp( initialRoute: customsplash.SplashScreen.id, routes: customsplash.SplashScreen.id: (context)=>customsplash.SplashScreen(), HomeScreen.id: (context)=>HomeScreen(), ,),);
【参考方案2】:
通过添加Consumer
解决,改成这样的代码
child: Consumer<Category>(
builder: (_,category,__)
return ListView.builder();
【讨论】:
以上是关于Flutter:`notifyListeners`不更新列表的主要内容,如果未能解决你的问题,请参考以下文章
在 deactivate() 中调用 notifyListeners() 会导致错误 - Flutter