是否有其他方法可以在提供者 Flutter 的自定义列表视图中更新数据
Is there other method to update data in custom listview in provider Flutter
我正在从 firebase 获取数据并显示在列表视图中。我将数据存储在列表中,然后通知它,但列表长度仍然为空。
我研究了所有相关问题,但仍然没有得到解决方案。
我希望每当我在 firebase 中添加一些新数据时它同时出现在列表视图中。因此,我在这里使用提供者。也请给我一些想法。
提前致谢
这是代码
class Home121 extends StatefulWidget {
@override
_Home121State createState() => _Home121State();
}
final fb = FirebaseDatabase.instance.reference().child("Data");
}
@override
Widget build(BuildContext context) {
Future<void> StoreData() async {
dynamic key=CreateCryptoRandomString(32);
fb.child(key).set({
"id": key,
"link": "EasyCoding",
}).then((value) {
ShowToastNow();
});
}
return ChangeNotifierProvider<TaskManager>(
create: (context) => TaskManager(),
child: Scaffold(
appBar: AppBar(
title: Text("Kkkk"),
),
body: Container(
margin: EdgeInsets.all(
8,
),
child: Consumer<TaskManager>(
builder: (context, myModel, child) {
return myModel.list.length==0? Text("zero"):ListView.builder(
itemCount:myModel.list.length,
itemBuilder: (context,index){
return Text(
myModel.list[index].Name,
style: TextStyle(
fontSize: 20,
),
);
},
);
}
)
),
)
);
}
@override
void initState() {
TaskManager task=TaskManager();
task.GetData();
}
}
class TaskManager extends ChangeNotifier{
List<Model> list=new List();
GetData(){
//get data here
}
AddNewTask(){
// add data to databse
list.add(model);
notifyListeners();
}
}
编辑:
class MyClass extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<TaskManager>(
create: (context) => TaskManager(),
child: Home121());
}
}
这是因为在 initState()
中您正在创建 TaskManager
的另一个实例并在该实例上调用方法 GetData()
。
因此 Consumer
小部件使用的 TaskManager
的实例是不同的,因此其中的列表始终为空。
相反,您需要在 initState()
..
中执行此操作
void initState() {
TaskManager task = Provider.of<TaskManager>(context);
task.GetData();
}
通过这样做,您可以在 Consumer
小部件使用的同一实例上调用 GetData()
方法。
我正在从 firebase 获取数据并显示在列表视图中。我将数据存储在列表中,然后通知它,但列表长度仍然为空。 我研究了所有相关问题,但仍然没有得到解决方案。
我希望每当我在 firebase 中添加一些新数据时它同时出现在列表视图中。因此,我在这里使用提供者。也请给我一些想法。
提前致谢
这是代码
class Home121 extends StatefulWidget {
@override
_Home121State createState() => _Home121State();
}
final fb = FirebaseDatabase.instance.reference().child("Data");
}
@override
Widget build(BuildContext context) {
Future<void> StoreData() async {
dynamic key=CreateCryptoRandomString(32);
fb.child(key).set({
"id": key,
"link": "EasyCoding",
}).then((value) {
ShowToastNow();
});
}
return ChangeNotifierProvider<TaskManager>(
create: (context) => TaskManager(),
child: Scaffold(
appBar: AppBar(
title: Text("Kkkk"),
),
body: Container(
margin: EdgeInsets.all(
8,
),
child: Consumer<TaskManager>(
builder: (context, myModel, child) {
return myModel.list.length==0? Text("zero"):ListView.builder(
itemCount:myModel.list.length,
itemBuilder: (context,index){
return Text(
myModel.list[index].Name,
style: TextStyle(
fontSize: 20,
),
);
},
);
}
)
),
)
);
}
@override
void initState() {
TaskManager task=TaskManager();
task.GetData();
}
}
class TaskManager extends ChangeNotifier{
List<Model> list=new List();
GetData(){
//get data here
}
AddNewTask(){
// add data to databse
list.add(model);
notifyListeners();
}
}
编辑:
class MyClass extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<TaskManager>(
create: (context) => TaskManager(),
child: Home121());
}
}
这是因为在 initState()
中您正在创建 TaskManager
的另一个实例并在该实例上调用方法 GetData()
。
因此 Consumer
小部件使用的 TaskManager
的实例是不同的,因此其中的列表始终为空。
相反,您需要在 initState()
..
void initState() {
TaskManager task = Provider.of<TaskManager>(context);
task.GetData();
}
通过这样做,您可以在 Consumer
小部件使用的同一实例上调用 GetData()
方法。