如何从警报框中更新Navigator.pop()之后的页面状态

时间:2019-01-04 14:37:15

标签: dart flutter sqflite

我的Flutter应用程序中有2个页面-ShoppingListsPage和ItemsListPage。我在ShoppingListsPage单击中有一个FloatingActionButton,它将使用户转到ItemsListPage,他可以在其中将ListView中的项目添加到购物清单中,然后通过单击AppBar中的按钮来保存列表。用户单击AppBar中的“完成”按钮后,我将显示一个AlertDialog对话框,询问用户该列表的名称。用户输入列表名称并单击对话框中的“保存”按钮后,我将列表详细信息保存在SQLite数据库中(我正在使用sqflite插件进行数据库交互),然后要将用户移回ShoppingListsPage,其中新创建的列表必须显示。

在这种情况下,我观​​察到的是,当我将列表保存到数据库并使用Navigate.pop(context)导航到ShoppingListsPage时,将执行从数据库中获取购物清单的代码,但不会检索最新添加的内容,因此ShoppingListsPage中的ListView不会使用最新更改进行更新。但是,如果我导航到其他页面并返回,则会显示新添加的列表。在将数据持久存储在数据库中之前,似乎正在从ShoppingListsPage中的数据库中进行获取。如何确保从数据库中成功获取(使用最新数据)?

在相关说明中,有什么更好的方法来确保在Navigator.pop(context)将用户带到上一个屏幕之前调用并完成我必须将数据保存到数据库的异步函数?我与SQLite数据库进行交互的所有功能都是异步功能。

以下是在ItemsList页面中显示对话框,保存数据并导航回ShoppingListsPage的代码:

_showListNameDialog() async {
    final textController = new TextEditingController();
    String retVal = await showDialog<String>(
        context: context,
        child: AlertDialog(
          contentPadding: EdgeInsets.all(12.0),
          content: Row(
            children: <Widget>[
              Expanded(
                child: TextField(
                  decoration: InputDecoration(
                      labelText: 'List Name',
                      hintText: 'Monthly groceries'
                  ),
                  controller: textController,
                ),
              )
            ],
          ),
          actions: <Widget>[
            FlatButton(
                onPressed: (){
                  Navigator.pop(context);
                },
                child: Text('Cancel')
            ),
            FlatButton(
                onPressed: (){
                  addShoppingListItemsToDB(textController.text, shoppingListItemMap);
                  Navigator.pop(context, textController.text);
                },
                child: Text('Save')
            )
          ],
        )
    );
    Navigator.pop(context);
    setState(() {
    });
  }

这是ShoppingListsPage中用于获取和显示数据的代码:

Future<List<ShoppingList>> getShoppingLists() async {
  DBHelper dbClient = DBHelper();
  return dbClient.getShoppingLists();
}

@override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text('Shopping Lists'),
      ),
      body: Container(
        padding: EdgeInsets.all(12.0),
        child: FutureBuilder<List<ShoppingList>>(
            future: getShoppingLists(),
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                return ListView.builder(
                    itemCount: snapshot.data.length,
                    itemBuilder: (context, index) {
                      String listName = snapshot.data[index].listName;
                      return Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: <Widget>[
                            ListTile(
                              leading: CircleAvatar(
                                child: Text(listName==''?'u':listName[0]),
                              ),
                              title: Text(snapshot.data[index].listName, style: TextStyle(fontSize: 18.0),),
                              subtitle: Text('Created at ${snapshot.data[index].createdAt}', style: TextStyle(color: Colors.grey),),
                              onTap: () {
                                Navigator.push(
                                    context,
                                    MaterialPageRoute(builder: (context) => ShoppingListItemsPage(list_name: snapshot.data[index].listName,))
                                );
                              },
                            ),
                            Divider()
                          ]
                      );
                    }
                );
              } else if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              }
              return Container(alignment: AlignmentDirectional.center, child: CircularProgressIndicator(),);
            }
        ),
      ),
      floatingActionButton: FloatingActionButton(
          onPressed: (){
            Navigator.of(context).push(MaterialPageRoute(builder: (context) => ItemListPage(listName: 'Untitled',listItems: null,)));
          },
      child: Icon(Icons.add),),
    );
  }

1 个答案:

答案 0 :(得分:0)

您可以使用fileList <- untar(my_tar_dir.tar.gz, list=T) 关键字等到用户弹出await为止。

Widget