list - Flutter:当我在提供程序槽函数中更新我的列表时,我的屏幕没有更新
问题描述
我的主文件中的提供程序中有一个包含函数的列表。如果我通过小部件中的功能更新此列表(通过按下按钮),它似乎可以工作,但不会改变屏幕上的任何内容......
我有两个屏幕,应该使用相同的列表归档,所以我需要提供程序功能。在我看来(当然不一定是正确的)我对功能进行了正确的编码,所以问题可能是屏幕没有更新,尽管我使用了消费者。如果你能告诉我我的代码中的错误,那就太好了。
如果你能看看我的问题,我会很高兴 - 谢谢!
主文件:
void main() => runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => MyList()),
],
child: MyApp(),
),);
class MyList extends ChangeNotifier {
final List<String> heute = [
'Ereignis 1',
'Ereignis 2',
'Ereignis 3',
'Ereignis 4',
'Ereignis 5'
];
UnmodifiableListView<String> get items => UnmodifiableListView(heute);
int get totallength => heute.length;
void addItem(String item) {
heute.add(item);
notifyListeners();
}
void deleteItem(int index) {
heute.removeAt(index);
notifyListeners();
}
void removeAll() {
heute.clear();
notifyListeners();
}
}
小部件:
class ContainerListe extends StatefulWidget {
@override
_ContainerListeState createState() => _ContainerListeState();
}
class _ContainerListeState extends State<ContainerListe> {
final heute = MyList();
void addItem(String item) {
setState(() {
heute.addItem(item);});
Navigator.of(context).pop();
}
void removeAll(){setState(() {
setState(() {
heute.removeAll();});
});}
void deleteItem(int index) {
setState(() {
heute.deleteItem(index);
});}
void newEntry() {
showDialog<AlertDialog>(
context: context,
builder: (BuildContext context)
{return AddItemDialogWHW(addItem);});}
@override
Widget build(BuildContext context) {
final heute = MyList();
final elemente = heute.items;
return Consumer<MyList>(
builder: (context, mylist, child)
{
return
Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Container(
width: 400.0,
height: 550.0,
child: Align(
alignment: Alignment.bottomCenter,
child:
ListView.builder(
itemCount: Provider
.of<MyList>(context, listen: true)
.totallength,
itemBuilder: (context, i) {
return
Column(
children: [
ContainerVorlage(
elemente[i],
() => deleteItem(i),
),
SizedBox(
height: 15,
),
],
)
;
},
)
)),
SizedBox(
height: 40,
),
AddButton(
() => newEntry(),
),
]);
});
}
}
//More Code
解决方案
首先,从_ContainerListeState
final heute = MyList();
然后使用MyList
对象中的方法,您可以使用
return Consumer<MyList>(builder: (context, mylist, child)
... // rest code
ContainerVorlage(
elemente[i],
() => mylist.deleteItem(i),
),
推荐阅读
- c# - 从更新面板内动态生成的按钮调用服务器端方法
- graphql - Postman,测试 Graphql 响应
- javascript - 为什么我的 FizzBuzz 代码没有正确输出?
- c++ - 在 C++ 中继承结构
- php - 为什么我在尝试查找特定用户时从 laravel 的数据库中获取空值?
- typescript - 将两种类型关联在一起
- tomcat - 从 Tomcat ExpiresFilter 缓存中排除特定 URL
- amazon-web-services - 如何防止 API Gateway OAuth 范围在 Lambda 函数部署时被重置?
- mysql - 创建数据库卡在命令行中
- rstudio - RStudio 环境选项卡缺少字符串上的空格。这是一个BUG吗?