Navigator.pop(context) 不返回上一屏 Flutter

Posted

技术标签:

【中文标题】Navigator.pop(context) 不返回上一屏 Flutter【英文标题】:Navigator.pop(context) Not returning to the Previous Screen Flutter 【发布时间】:2021-07-28 02:32:57 【问题描述】:

我有一个包含联系人列表的联系人页面和一个FloatingActionButton,它转到Add_Contact() 页面。 在AppBar 上有一个form 和一个FlatButton SAVE,单击它们会发布表单数据并返回到之前的联系人列表页面。

但是每当我点击保存按钮时,它只会停留在该页面上,不会返回到上一页。我还尝试添加SnackBar,然后添加FlushBar 以显示联系人已保存,但即使这样也不会显示在屏幕上。

contacts_page.dart:

 //Rest of the code above
 floatingActionButton: _bottomButtons(context),
        ));
  

  Widget _bottomButtons(BuildContext context) 
    return _tabController.index == 0
        ? FloatingActionButton(
            shape: StadiumBorder(),
            onPressed: () 
              Navigator.push(context, MaterialPageRoute(builder: (_) 
                return AddContacts();
              ));
            ,
            backgroundColor: Colors.cyan,
            child: Icon(
              Icons.person_add,
              color: Colors.white,
            ))
        : FloatingActionButton(
            shape: StadiumBorder(),
            onPressed: () 
              Navigator.push(context, MaterialPageRoute(builder: (_) 
                return AddCompany();
              ));
            ,
            backgroundColor: Colors.cyan,
            child: Icon(
              Icons.add,
              color: Colors.white,
            ),
          );
  

add_contacts.dart:

 Future saveContact() async 
    final String firstName = _firstName.text;
    final String lastName = _lastName.text;
    final String email = _email.text;

    final AddContactModel contact =
        await API_Manager().addContact(firstName, lastName, email);
    Navigator.pop(context); //Not working
    setState(() 
      _contact = contact;
    );
  

  @override
  Widget build(BuildContext context) 
    return Form(
        key: _formKey,
        autovalidateMode: AutovalidateMode.onUserInteraction,
        child: Scaffold(
          appBar: AppBar(
            title: Text('Add Contact'),
            actions: <Widget>[
              FlatButton(
                textColor: Colors.white,
                onPressed: () async 
                  if (_formKey.currentState.validate()) 
                    await saveContact();
                  
                ,
                child: Text(
                  'SAVE',
                  style: TextStyle(
                    fontSize: 18,
                    color: Colors.white,
                    fontWeight: FontWeight.w600,
                  ),
                ),
                shape:
                    CircleBorder(side: BorderSide(color: Colors.transparent)),
              )
            ],
          ),
          body: SingleChildScrollView(
            child: Container(
              margin: EdgeInsets.all(5),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  TextFormField(
                    onSaved: null,
                    controller: _ipCountryCode,
                    keyboardType: TextInputType.text,
                    decoration: InputDecoration(
                        labelText: 'IP Country Code',
                        fillColor: Colors.white,
                        filled: true,
                        contentPadding: EdgeInsets.all(8)),
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: <Widget>[
                      Expanded(
                        child: DateTimeFormField(
                          decoration: InputDecoration(
                              labelText: 'Time First Seen',
                              fillColor: Colors.white,
                              filled: true,
                              contentPadding: EdgeInsets.all(8)),
                          onDateSelected: (DateTime value) 
                            setState(() 
                              timeFirstSeen = value;
                            );
                          ,
                        ),
                      ),
                    ],
                  ), 
                  //Rest of the Code Below

以下是两个屏幕的屏幕截图:

First Screen

Second Screen

同样题外话,有没有更好的方法来发布具有大量字段的表单数据?目前我正在使用 HttpClient,我只能发布 3 个字段值 firstname、lastname 和 email。我尝试将表单中存在的其他字段添加到请求的正文和参数中,但它不会发布它们。我还尝试将整个 JSON 模型提供给请求的正文和函数的参数,但我不知道如何实际调用请求函数并将 TextFormField 控制器分配给它的值以发布数据。如果你也能帮我解决这个问题,那就太好了。

编辑:

API_Manager():

 Future<AddContactModel> addContact(
      String firstName, String lastName, String email) async 
    var client = http.Client();
    String addContactUrl =
        "https://example.com/ma/api/contacts/new";
    String basicAuth = 'Basic examplebasicauthkey';
    var response = await client.post(addContactUrl, headers: <String, String>
      'authorization': basicAuth,
      "Accept": "application/json",
      "Content-Type": "application/x-www-form-urlencoded",
    , body: 
      "firstname": firstName,
      "lastname": lastName,
      "email": email,
    );
    // print(response.statusCode);
    //developer.log(response.body);
    if (response.statusCode == 201) 
      final String responseString = response.body;
      return addContactModelFromJson(responseString);
     else 
      return null;
    
  

【问题讨论】:

你确定_formKey.currentState.validate()是真的吗? 我没有在您的表单字段中看到任何验证器功能。我编写了一个测试应用程序,如果没有验证器,_formKey.currentState.validate() 将返回 true。您的API_Manager() 中可能有错误 @LuisA.Chaglla 是的,因为数据正在发布到服务器。 您是否遇到任何错误?如果没有,也许对API_Manager().addContact 的调用永远不会解决 让我们continue this discussion in chat. 【参考方案1】:

Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => ProductDetailView(),
            ));

流行音乐

Navigator.of(context).pop();

你能检查一下这是否有效吗?

【讨论】:

不,仍然无法正常工作。是不是和RefreshIndicator 有关系。因为我看到另一个帖子,其中Navigator.pop 在他使用RefreshIndicator 时不起作用。

以上是关于Navigator.pop(context) 不返回上一屏 Flutter的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中的 navigator.pop(context) 之后显示小吃栏?

Flutter - 从 AppBar 返回上一页不会刷新页面,使用 Navigator.pop(context)

使用 page_transition 更改 Navigator.pop() 动画持续时间

来自 FutureBuilder 的 Navigator.pop

运行 navigator.pop() 后如何刷新 React 状态?

在 Navigator.pop 之后 StreamBuilder 不会重建