flutter - Flutter:提供者:ListView 在 notifyListener() 之后没有重新绘制
问题描述
我已经看到这个问题被问了很多次,没有答案。我想深入了解它。如果没有这个工作,我真的无法在我的应用程序中前进......
为什么 Provider 在 notifyListeners 调用后无法触发 ListView 重绘。
简化代码示例(数据桶):
class TheData extends ChangeNotifier {
List<ListTile> data = [
ListTile(title: Text('A')),
];
addTile() {
data.add(ListTile(title: Text('B')));
notifyListeners();
}
}
使用 TheData 的屏幕:
class TheScreen extends StatefulWidget {
@override
TheScreenState createState() => TheScreenState();
}
class TheScreenState extends State<TheScreen> {
@override
Widget build(BuildContext context) {
return Consumer<TheData>(
builder: (ctx, _theData, _) {
print('rebuilding count = ${_theData.data.length}');
return ListView(
children: _theData.data,
);
}
);
}
}
假设 TheData 类在小部件树中的此屏幕上方正确提供,并且我触发了“addTile()”。打印显示“数据”中现在有 2 个元素,但 ListView 没有改变。
这真让我抓狂。
解决方案
我不知道为什么这会产生影响,或者它是否效率较低......但是,使用 ListView.builder() 可以解决问题:
class TheScreen extends StatefulWidget {
@override
TheScreenState createState() => TheScreenState();
}
class TheScreenState extends State<TheScreen> {
@override
Widget build(BuildContext context) {
return Consumer<TheData>(
builder: (ctx, _theData, _) {
print('rebuilding count = ${_theData.data.length}');
return ListView.builder(
itemCount: _theData,data.length,
itemBuilder: (c, i) => _theData.data[i],
);
}
);
}
}
推荐阅读
- reactjs - 使用 react 样式的组件将 .png 徽标添加到我的导航栏
- javascript - Angular Style DOM 元素问题
- javascript - 将材质 UI 卡设置为最大高度
- jquery - 点击按钮滑动div
- leaflet - 如何在带有传单的 next.js 应用程序中使用我的 GeoJSON 数据?
- reactjs - 防止 context.consumer 重新渲染组件
- python - 无法使用 python 为 libsass 设置 output_style 以在每次部署时编译 SASS
- r - 在 plotly 和 ggplot2 中放置相同的颜色
- swift - Xcode 11 动作编辑器?如何调用?
- authentication - JMeter 中用于 Microsoft 登录的 Autorization Bearer 的解决方法(适用于具有特定组织服务帐户的单页应用程序)