【问题标题】:How stop SetState flutter如何停止 SetState 颤动
【发布时间】:2021-05-25 11:57:43
【问题描述】:

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

我的表单代码:

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(() {});
  }

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

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

【问题讨论】:

  • 您的意思是应用程序重新加载吗?有什么错误吗?
  • 屏幕自动刷新
  • 不是错误,而是正在使用的操作(刷新屏幕)
  • 所以你只想刷新按钮而不是整个屏幕?
  • 是的...特别是我只想刷新输入文本以添加新名称。编辑输入后屏幕会刷新

标签: flutter dart


【解决方案1】:

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

但是,解决上述问题并保持代码整洁的最佳且简洁的解决方案是使用 Provider 模式。

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

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

在下面移动之前阅读上面的文章。

基本上我们所做的是:

创建一个 ChangeNotifier 类。

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果您想更新您按下的同一个小部件,这很好。如果您想更新其他一些小部件,您应该考虑使用其他解决方案,例如使用提供程序。
    • 为什么不在有状态构建器内的单个列中构建所有要更新的小部件?
    • 这可以被认为是一种场景,其中只有您想要刷新的小部件被分组在一个组小部件中,如行、列或堆栈。强制组小部件中的小部件只是专门刷新它们可能不是一个好的选择,因为组小部件并非完全为此目的而制作,而是仅作为 UI 元素制作。
    • 上述众多示例之一可以是:假设您有一列 10 个红色容器,最后有一个按钮。但是您只需在按下按钮后更新最后 3 个容器的颜色。在这种情况下,您必须在实际列内嵌套一个包含最后 3 个容器和按钮的单独列。我们可以看到这不是一个好的做法。并且说在上述相同的情况下,如果您必须更新列的替代容器的颜色而不是最后 3 个,这将不是一个可行的选择。
    • 您查看我发布的解决方案了吗?它会解决你的问题
    猜你喜欢
    • 2020-12-13
    • 2022-11-28
    • 2020-08-05
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多