如何停止 SetState 颤振

时间:2021-05-25 11:57:43

标签: flutter dart

我从事颤振项目。当我单击修改图标以编辑名称时 ==> 屏幕会自动滚动。单击编辑按钮后如何停止刷新屏幕?

这段我的表单代码:

Row(
    mainAxisAlignment: MainAxisAlignment.spaceBetween,
    children: [
        Text('Adresse email :',
            style: TextStyle(
                color: Color(0xFF4053FCF),
                fontSize: 16,
                fontWeight: FontWeight.w600
            ),
        ),
        IconButton(
            icon: Icon(CommunityMaterialIcons.pencil,
            color: Colors.grey,
            ),
            onPressed: () {
                emailNode.requestFocus();
                setState(() {
                    enableemail = true;
                });
            })
    ],
),

  void editUserProfile() async {
    setState(() {});

    // if (_formKey.currentState.validate()) {
    String name = _nameController.text;
    String email = _emailController.text;
    String adress = _adressController.text;

    userApi.editUserProfile(name, email, adress).then((data) {
      print(data);
      if (data != null) {
        //   Navigator.pop(context);

        /*  Navigator.push(
            context, MaterialPageRoute(builder: (context) => Profile()));*/
      }
      //  setState(() {});

      /* Navigator.push(
            context, MaterialPageRoute(builder: (context) => BoxSettings()));*/

      setState(() {
        enableup = false;
        enableadress = false;
        enableemail = false;
      });

      ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(data)));

      // ScaffoldMessenger.of(context).showSnackBar(snackBar3);
    }).catchError((error) {
      ScaffoldMessenger.of(context)
          .showSnackBar(SnackBar(content: Text(error.toString())));
    });
    setState(() {});
  }

这是我的屏幕以获取更多信息:

enter image description here

如何在不重新加载屏幕的情况下按下编辑按钮?

2 个答案:

答案 0 :(得分:1)

有一些解决方法可以实现这一点(即在点击一个完全不同的小部件后更新一个小部件的状态),例如将回调函数作为参数传递等。

但是这里最好和最简洁的解决方案是使用提供者模式,可以解决上述问题并保持代码整洁。

如果您不了解 Provider 模式的工作原理,您可以轻松地在谷歌上搜索有关它的文章。这是其中之一:

https://www.raywenderlich.com/6373413-state-management-with-provider

阅读上面的文章,然后再往下移动。

基本上我们所做的是:

创建一个 ChangeNotifier 类。

用 ChangeNotifierProvider 小部件包装两个小部件的父级。

用消费者小部件包装您要更新的小部件。

然后在编辑按钮的 onTap/onPressed 函数中,您可以调用一个将调用 notifyListener() 函数的函数。这将做的是它会通知上面的 ChangeNotifierProvider 小部件在它的小部件树中发生了一些变化。然后它将遍历下面的整个子部件树,并更新用 Consumer 部件包装的部件。

这样一来,您就无需刷新整个屏幕,并且可以通过对完全不同的小部件执行某些操作来轻松更新一个小部件。

答案 1 :(得分:0)

将要刷新的小部件包裹在有状态构建器中并使整个屏幕成为无状态小部件,然后调用有状态构建器