【发布时间】:2021-05-12 16:21:37
【问题描述】:
我有一个 TabFolder。在我的选项卡中,我有一个带有许多按钮的 ListView。这些按钮是通过引用 JSON 文件中的项目创建的,这意味着我必须使用 Future 来获取 JSON,并使用 FutureBuilder 来构建我的列表。所有这些都运行良好。
现在,当我长按此列表中的某个项目时,我会弹出一个警报,要求用户确认或取消操作。操作是删除。确认后,删除操作会从 JSON 文件中删除按钮项。这工作得很好。
我现在正在尝试重建列表,并删除了该项目,但无论我尝试了什么,它都停留在那里,直到我移动到另一个选项卡并再次返回(我必须重复两次)。
如何让我的 FutureBuilder 刷新对 JSON 的调用。我已经尝试进行另一个调用以从警报返回中获取我的 Future (JSON),我已经在我的 FutureBuilder 中尝试过,我已经在 onLongPress 中尝试过,我已经尝试在很多地方放置 setState...
当您知道它应该工作时,这种异步令人沮丧(如果我不必使用异步和 Futures 它将工作)。 无论如何,这是我的 FutureBuilder 代码。
Widget buildInProgress(List<Widget> inProgressList) {
return Center(
child: FutureBuilder<InProgressList>(
future: futureInProgressList,
builder: (context, snapshot) {
if (snapshot.hasData) {
inProgressList.clear();
snapshot.data!.Forms!.forEach((InProgressItems formItem) {
inProgressList.add(
Container(
child: TextButton(
child: Row(
children: [
RichText(text: TextSpan(
text: formItem.formName! + "\n",
style: TextStyle(color: Colors.black, fontSize: 15.0, fontWeight: FontWeight.bold,),
children: <TextSpan>[
TextSpan(
text: formItem.displayDetail!,
style: TextStyle(color: Colors.grey[700], fontSize: 11.0,),
),
]
)),
],
),
onPressed: () {
getFormSendData(context, formItem);
},
onLongPress: () {
setState(() {
_popupDeleteQuestion(context, formItem);
});
},
),
decoration: BoxDecoration(
border: Border(bottom: BorderSide(color: Colors.purple[400]!)),
),
),
);
});
return
ListView(
children: inProgressList,
padding: EdgeInsets.all(8.0),
);
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
// By default, show a loading spinner
return CircularProgressIndicator();
},
),
);
}
我已经为我的 TabController 设置了一个监听器来处理选项卡选择...
_handleTabSelection() {
switch(_tabController!.index) {
case 0:
setState(() {
});
break;
case 1:
setState(() {
futureFormList = fetchForms();
});
break;
case 2:
setState(() {
futureInProgressList = showInProgressOrSubmitted("InProgress.json");
});
break;
case 3:
setState(() {
futureSubmittedList = showInProgressOrSubmitted("Submitted.json");
});
break;
}
}
监听器命中,BuildInProgress 命中,但页面没有用新数据刷新。
非常感谢您的帮助。
void _popupDeleteQuestion(BuildContext context, InProgressOrSubmittedItems formItem) async {
showDialog(
context: context,
builder: (context)
{
return AlertDialog(
title:Text("DELETE FORM"),
content: StatefulBuilder(
builder: (context, setState) {
return Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text("Warning: This will delete all the data contained in this form.")
],
);
}),
actions: <Widget>[
new TextButton(
onPressed: () {
setState((){
});
Navigator.of(context).pop();
},
//Color: Theme.of(context).primaryColor,
child: Text('Cancel'),
),
new TextButton(
onPressed: () async {
_deleteForm(formItem);
setState((){
Navigator.of(context).pop();
});
},
child: Text('Accept'),
),
],
);
});
}
void _deleteForm(InProgressOrSubmittedItems formItem) async {
HandleFile file = new HandleFile();
file.deleteFile("${formItem.documentId}*");
String detailFile = await file.readFile("InProgress.json");
Map<String, dynamic> formData = new Map<String, dynamic>();
if (detailFile != "")
{
formData = jsonDecode(detailFile);
}
List<dynamic> ipforms = [];
if (formData.isNotEmpty)
{
ipforms = formData["FileList"];
}
List<dynamic> formDetail = [];
try {
formDetail = ipforms.where((element) => element["documentId"] !=
formItem.documentId).toList();
}
catch (e) {
}
formData["FileList"] = formDetail;
file.writeFile("InProgress.json", json.encode(formData));
}
}
【问题讨论】: