【问题标题】:Flutter app variables reset each time you leave the page每次离开页面时 Flutter 应用程序变量都会重置
【发布时间】:2022-01-06 18:10:07
【问题描述】:

我正在制作一个颤振应用程序。每次我离开页面时,变量都会重置。即使您离开页面,如何使数据保持不变?我正在使用 getx 进行状态管理。这是我的代码:

  //Button that leaves the page
  Align(
   alignment: Alignment.topLeft,
    child: IconButton(
     onPressed: () => Get.back(),
       icon: const Icon(Icons.arrow_back),
    ),
 ),

当您单击按钮时,它会离开页面并重置此处显示的变量 maintasks。

      Align(
          alignment: Alignment.topLeft,
          child: Padding(
          padding: const EdgeInsets.only(left: 25.0),
            child: Text(
              maintasks,
              style: const TextStyle(
              fontSize: 23,
              color: Colors.black,
              fontWeight: FontWeight.w800,
              ),
            ),
          ),
       ),

有一个函数可以将变量 maintasks 更改为用户输入。但是,每次离开页面时都会重置此用户输入。我尝试使用 SetState 来保存变量,但由于某种原因它不起作用。

抱歉,如果我的问题措辞不当。如果有人知道如何做到这一点,请告诉我。提前致谢。

【问题讨论】:

    标签: flutter flutter-getx


    【解决方案1】:

    小部件被释放后,小部件状态会立即重置。 为此,使用 GetX,您可以使用 GetXControllers 例如,假设您需要一个由用户名和密码组成的状态,

        class LoginController extends GetxController {//GetxController comes from Getx package
          var username = ''.obs;//creates a stream that can be listened from the UI, whose value is a String
          var password = ''.obs;//same here
          void onUsernameChanged(String newValue) {
            username(newValue);//changes username stream last value to newValue's
          }
          void onPasswordChanged(String newValue) {
            password(newValue);//the same
          }
        }
    

    现在,您必须在构建小部件之前在小部件树中插入此控制器的实例(例如,在 initState 中)

        @override
          void initState() {
            _controller = Get.put<LoginController>(LoginController());
            super.initState();
          }
    

    一旦您知道在小部件树中有此实例,您只需使用 GetX 小部件收听其流

    GetX<LoginController>(
      builder: (controller)=>Text(controller.username.value)
    )//this guy will repaint every time username changes
    

    这很重要,因为此小部件的实例将在小部件树中保持活动状态,直到应用结束或控制器被显式删除

    【讨论】:

    • 抱歉,我不太清楚如何在我的小部件树中初始化控制器 - 这样做时会引发很多错误。当我只使用 GetX 小部件时,由于某种原因它不显示文本。
    • @Neek666 抱歉,我在谈到初始化时粘贴了错误的代码。现在已经修复了