无法使用 Getx 控制器更新小组件数据



部件内部数据不更新。

遵循重用小部件代码的最佳实践。我有DashboardScreenDashboardScreenController,代码如下:

仪表板屏幕:

class DashboardScreen extends StatelessWidget {
DashboardScreen({Key? key}) : super(key: key);
final DashboardController controller = Get.find();
@override
Widget build(BuildContext context) {
return Scaffold(
key: controller.scaffoldKey,
body: _buildProfile(data: controller.getProfil()),
}
Widget _buildProfile({required Profile data}) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: kSpacing),
child: _ProfilTile(
data: data,
onPressedLogOut: () {
controller.logoutUser();
},
),
);
}
}

仪表板控制器:

class DashboardController extends GetxController {
final scaffoldKey = GlobalKey<ScaffoldState>();
// for handling authenticaion
final AuthService _authService = Get.find();
final _localSecureStorage = Get.find<LocalSecureStorage>();
Rx<User?> currentUser = null.obs;
@override
void onInit() {
assignCurrentUser();
super.onInit();
}
void assignCurrentUser() async {
User? secureData = await _localSecureStorage.getUser;
currentUser.update((currentUser) => currentUser = secureData);
}
// Data
Profile getProfil() {
return Profile(
photo: const AssetImage(ImageRasterPath.avatar1),
name: currentUser.value != null
? currentUser.value!.username.toString()
: "Loading..",
email: currentUser.value != null
? currentUser.value!.email.toString()
: "Loading..",
);
}

,可重用的部分是概要文件小部件:

class _ProfilTile extends StatelessWidget {
const _ProfilTile(
{required this.data, required this.onPressedLogOut, Key? key})
: super(key: key);
final Profile data;
final Function() onPressedLogOut;
@override
Widget build(BuildContext context) {
return ListTile(
title: Text(data.name),
subtitle: Text(data.email),
);
}
}

我试过:

  1. User? currentUser代替'Rx<User?>currentUser"但是这对更新UI没有帮助,只在热加载
  2. 之后才有效
  3. 尝试使用Obx()widget在所有可能的方式
  • 在仪表板中重构_buildProfile(data: controller.getProfil())
  • 在_ProfilTile中重构ListTilewidget
  • 在_ProfilTile中独立重构每个Text()都给我一个错误

检测到GetX使用不当。使用bottomNavigationBar

  1. 试图在assignCurrentUser功能中使用update()refresh()功能

还是有同样的问题。我的应用程序的流程是,我通过使用await从我的安全本地存储获取用户,并通过将控制器中的用户数据和屏幕中的更新数据传递给小部件_ProfileTile

首先,您需要将需要更新的小部件封装在Obx小部件中。

Dashbord屏幕:

class DashboardScreen extends StatelessWidget {
DashboardScreen({Key? key}) : super(key: key);
final DashboardController controller = Get.find();
@override
Widget build(BuildContext context) {
return Scaffold(
key: controller.scaffoldKey,
body: Obx(() => _buildProfile(data: controller.getProfil())),
}
...
}

然后在DashboardController中,你可以这样更新currentUser的值:

仪表板控制器:

class DashboardController extends GetxController {
final Rx<User?> currentUser = Rx<User?>(null);
...
void assignCurrentUser() async {
User? secureData = await _localSecureStorage.getUser;
currentUser.value = secureData;
}
...
}

最新更新