【问题标题】:widget doesn't update when another controller state changed using getx当使用 getx 更改另一个控制器状态时,小部件不会更新
【发布时间】:2021-07-22 04:04:10
【问题描述】:

描述错误 我有两个控制器,第一个是 LoginController 用于保存用户登录状态,第二个是 settingsController 来管理应用程序设置,我在设置小部件中有一个切换器按钮来更改用户状态(可用,不可用),这样做我使用 Get.put ,它可以显示用户状态,但是当我尝试更改状态时出现问题,设置小部件没有改变它的状态

**复制代码

class AppPages {
static const INITIAL = AppRoutes.RootURL;

static final routes = [

//Simple GetPage
GetPage(
  name: AppRoutes.HomePageURL,
  page: () => HomePage(),
  binding: BindingsBuilder(() => Get.lazyPut(() => HomeController())),
  transition: Transition.fade,
  parameter: {},
  middlewares: [],
  children: [],
),
GetPage(
  name: AppRoutes.LoginPageURL,
  page: () => LoginPage(),
  binding: BindingsBuilder (() => Get.put<LoginController>(LoginController(), permanent: true)),
  parameter: {},
  middlewares: [],
  children: [],
),
GetPage(
  name: AppRoutes.RegisterPageURL,
  page: () => RegisterPage(),
  binding: BindingsBuilder(() => Get.lazyPut(() => RegisterController())),
  parameter: {},
  middlewares: [],
  children: [],
),
GetPage(
  name: AppRoutes.SettingsPageURL,
  page: () => SettingsPage(),
  binding: BindingsBuilder (() => Get.put<SettingsController>(SettingsController(), permanent: true)
  ),
  parameter: {},
  middlewares: [],
  children: [],
),
GetPage(
  name: AppRoutes.NotifiesPageURL,
  page: () => NotifiesPage(),
  binding: BindingsBuilder(
      () => Get.lazyPut(() => NotifiesController())
  ),
  parameter: {},
  middlewares: [],
  children: [],
),
GetPage(
  name: AppRoutes.OrdersPageUrl,
  page: () => OrdersPage(),
  binding: BindingsBuilder(
    () => Get.lazyPut(() => OrdersController())
  ),
  parameter: {},
  middlewares: [],
  children: [],
),
GetPage(
  name: AppRoutes.OrdersPageUrl,
  page: () => OrderContainerPage(),
  binding: BindingsBuilder(
    () => Get.lazyPut(() => OrdersController())
  ),
  parameter: {},
  middlewares: [],
  children: [],
),
GetPage(
  name: AppRoutes.OrderDetailsPageUrl,
  page: () => OrderDetailsPage(),
  binding: BindingsBuilder(() => Get.lazyPut(() => OrderDetailsController())),
  parameter: {},
  middlewares: [],
  children: [],
),
GetPage(
  name: AppRoutes.ContactPageURL,
  page: () => ContactPage(),
  binding: BindingsBuilder(() => Get.lazyPut(() => ContactController())),
  transition: Transition.fade,
  parameter: {},
  middlewares: [],
  children: [],
),
GetPage(
  name: AppRoutes.PagesUrl,
  page: () => PostsPage(),
  binding: BindingsBuilder(() => Get.lazyPut(() => PostsController())),
  transition: Transition.fade,
  parameter: {},
  middlewares: [],
  children: [],
),
];
}

class SettingsPage extends GetView<SettingsController> {
  final user = Get.put(LoginController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Colors.white,
        body:  Obx(
    () => Container(
      height: 70,
      decoration: BoxDecoration(
        color: AppColors.primaryColor,
        backgroundBlendMode: BlendMode.softLight,
      ),
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        children: [
          Text(
            "change status",
            style: AppStyles.primaryMediumTextStyle,
          ),
          _buildAvailableButton('Available', 1),
          _buildAvailableButton('Not Available', 0),
        ],
      ),
    ),
        )
    );
  }


  _buildAvailableButton(text, btnStatus) {
    return Container(
      alignment: Alignment.center,
      child: ConstrainedBox(
        constraints: BoxConstraints.tightFor(width: 100, height: 35),
        child: ElevatedButton(
          style: ElevatedButton.styleFrom(
              primary: user.userData.value.status ==  btnStatus
                  ? AppColors.primaryColor
                  : AppColors.secondaryColor,
              // AppColors.primaryColor, AppColors.secondaryColor
              shape: RoundedRectangleBorder(
                  side: BorderSide(
                      color: AppColors.primaryColor,
                      width: 1,
                      style: BorderStyle.solid),
                  borderRadius: BorderRadius.circular(65))),
          child: Text(text,
              style: user.userData.value.status ==  btnStatus
                  ? AppStyles.primaryCardText
                  : AppStyles.secondaryCardText),
          //  AppStyles.primaryCardText AppStyles.secondaryCardText
          // AppStyles.secondaryCardText
          onPressed: () async {
            user.userData.value.status =  btnStatus ;
          },
        ),
      ),
    );
  }
}

复制 重现行为的步骤:

  1. 点击_buildAvailableButton
  2. 用户状态没有改变

预期行为 当更改用户状态时,小部件应该重建以影响此更改

Flutter 版本: 颤振 2.0.5 Getx 版本: 得到:^4.1.4

描述您在哪个设备上发现了该错误: 例如:小米安卓。

最少的重现代码

     onPressed: () async {
        user.userData.value.status =  btnStatus ;
      },

【问题讨论】:

  • 你能分享你的相关Getx课程吗?目前尚不清楚您是否正确实施 user 以使其可观察。
  • 还有你真正想要更新的 UI 部分,因为看起来你只是在共享按钮和设置页面。您要更新的状态在应用中的其他位置,对吗?

标签: flutter flutter-getx


【解决方案1】:

只需用 Obx 包裹您的 ElevatedButton

_buildAvailableButton(text, btnStatus) {
return Container(
  alignment: Alignment.center,
  child: ConstrainedBox(
    constraints: BoxConstraints.tightFor(width: 100, height: 35),
    child: Obx(()=> ElevatedButton(
      style: ElevatedButton.styleFrom(
          primary: user.userData.value.status ==  btnStatus
              ? AppColors.primaryColor
              : AppColors.secondaryColor,
          // AppColors.primaryColor, AppColors.secondaryColor
          shape: RoundedRectangleBorder(
              side: BorderSide(
                  color: AppColors.primaryColor,
                  width: 1,
                  style: BorderStyle.solid),
              borderRadius: BorderRadius.circular(65))),
      child: Text(text,
          style: user.userData.value.status ==  btnStatus
              ? AppStyles.primaryCardText
              : AppStyles.secondaryCardText),
      //  AppStyles.primaryCardText AppStyles.secondaryCardText
      // AppStyles.secondaryCardText
      onPressed: () async {
        user.userData.value.status =  btnStatus ;
      },
    ),
   ),
  ),
 );
}

【讨论】:

  • 我已经做了那个人,但它意外删除,代码更新
  • 但是你可能在错误的地方使用了Obx!请先按照建议做,然后告诉我结果。
  • 正如我上面所说,我已经更新了问题中的代码,问题不是 obx,我已经使用它,你可以看到代码
  • 哦!我认为 user.userData.value.status (status) 变量是不可观察的。 userData 也是控制器吗?如果您包含 LoginController 的代码,这将很有用。
猜你喜欢
  • 2021-07-20
  • 1970-01-01
  • 2019-12-17
  • 2021-05-11
  • 2021-06-27
  • 2022-01-23
  • 2021-09-11
  • 1970-01-01
  • 2016-09-23
相关资源
最近更新 更多