我无法将 GetX 状态管理值分配给整数
I can not assign GetX state management value to integer
我想创建带有 GetX 状态管理的 BottomNavigationBar。我将页面索引保存在我的 GetXController 上。
class PagerController extends GetxController {
RxInt pageIndex = 0.obs;
changePageTo(int index) {
pageIndex.value = index;
}
}
这是我的 BottomNavigationBar 小部件。它是无状态的。
BottomNavigationBar(
showSelectedLabels: false,
showUnselectedLabels: false,
selectedItemColor: Palette.kSelectedCategoryColor,
unselectedItemColor: Palette.kUnselectedCategoryTextColor,
elevation: 0,
enableFeedback: false,
currentIndex: controller.pageIndex.value,
items: items,
onTap: (index) => controller.changePageTo(index),
);
onTap 我的 body 正在改变。但是我的底部导航栏的活动图标颜色没有改变。在我看来,它会导致 currentIndex 属性。我放了controller.pageIndex.value
,但不是监听值,只渲染一次。如何解决?
首先,您应该将 pageIndex
的类型从 RxInt
更改为 int
或只是 var
(添加 .obs
就足够了)。
其次,为了更新 BottomNavigationBar
,您需要将其包装在 Obx()
中,例如:
Obx(() => BottomNavigationBar(
showSelectedLabels: false,
showUnselectedLabels: false,
selectedItemColor: Palette.kSelectedCategoryColor,
unselectedItemColor: Palette.kUnselectedCategoryTextColor,
elevation: 0,
enableFeedback: false,
currentIndex: controller.pageIndex.value,
items: items,
onTap: (index) => controller.changePageTo(index),
)
)
我认为您可以使用 GetBuilder。我通过将您的 navBar 代码替换为来通过我的 DashBoard 页面代码。在这种情况下,事件不需要放置 obs(在控制器中)和 Obx(在视图中)。
Widget build(BuildContext context) {
return GetBuilder<DashBoardController>(builder: (controller) {
return Scaffold(
body: SafeArea(
child: IndexedStack(
index: controller.pageIndex,
children: [
HomeScreen(),
MeScreen(),
],
),
),
bottomNavigationBar: BottomNavigationBar(
showSelectedLabels: false,
showUnselectedLabels: false,
selectedItemColor: Palette.kSelectedCategoryColor,
unselectedItemColor: Palette.kUnselectedCategoryTextColor,
elevation: 0,
enableFeedback: false,
currentIndex: controller.pageIndex,
items: items,
onTap: controller.changePageTo,
),
);
});
}
在dash_board_controller.dart中,我们在控制器中获取了changePageTo方法。它执行更新以完成页面刷新工作。
class DashBoardController extends GetxController {
var tabIndex = 0;
var getToNamedList = [
Routes.HOME,
Routes.ME,
];
final List<BottomNavigationBarItem> navTabList = <BottomNavigationBarItem>[
BottomNavigationBarItem(
activeIcon: ImageIcon(
AssetImage('assets/***.png'),
size: 24,
),
icon: ImageIcon(
AssetImage('assets/***.png'),
size: 24,
),
label: "Home",
),
BottomNavigationBarItem(
activeIcon: ImageIcon(
AssetImage('assets/***.png'),
size: 24,
),
icon: ImageIcon(
AssetImage('assets/***.png'),
size: 24,
),
// icon: Icon(Icons.person),
label: "Me",
),
];
void changePageTo(int index) {
tabIndex = index;
update();
}
}
您需要使用 Obx 包裹底部导航栏
我想创建带有 GetX 状态管理的 BottomNavigationBar。我将页面索引保存在我的 GetXController 上。
class PagerController extends GetxController {
RxInt pageIndex = 0.obs;
changePageTo(int index) {
pageIndex.value = index;
}
}
这是我的 BottomNavigationBar 小部件。它是无状态的。
BottomNavigationBar(
showSelectedLabels: false,
showUnselectedLabels: false,
selectedItemColor: Palette.kSelectedCategoryColor,
unselectedItemColor: Palette.kUnselectedCategoryTextColor,
elevation: 0,
enableFeedback: false,
currentIndex: controller.pageIndex.value,
items: items,
onTap: (index) => controller.changePageTo(index),
);
onTap 我的 body 正在改变。但是我的底部导航栏的活动图标颜色没有改变。在我看来,它会导致 currentIndex 属性。我放了controller.pageIndex.value
,但不是监听值,只渲染一次。如何解决?
首先,您应该将 pageIndex
的类型从 RxInt
更改为 int
或只是 var
(添加 .obs
就足够了)。
其次,为了更新 BottomNavigationBar
,您需要将其包装在 Obx()
中,例如:
Obx(() => BottomNavigationBar(
showSelectedLabels: false,
showUnselectedLabels: false,
selectedItemColor: Palette.kSelectedCategoryColor,
unselectedItemColor: Palette.kUnselectedCategoryTextColor,
elevation: 0,
enableFeedback: false,
currentIndex: controller.pageIndex.value,
items: items,
onTap: (index) => controller.changePageTo(index),
)
)
我认为您可以使用 GetBuilder。我通过将您的 navBar 代码替换为来通过我的 DashBoard 页面代码。在这种情况下,事件不需要放置 obs(在控制器中)和 Obx(在视图中)。
Widget build(BuildContext context) {
return GetBuilder<DashBoardController>(builder: (controller) {
return Scaffold(
body: SafeArea(
child: IndexedStack(
index: controller.pageIndex,
children: [
HomeScreen(),
MeScreen(),
],
),
),
bottomNavigationBar: BottomNavigationBar(
showSelectedLabels: false,
showUnselectedLabels: false,
selectedItemColor: Palette.kSelectedCategoryColor,
unselectedItemColor: Palette.kUnselectedCategoryTextColor,
elevation: 0,
enableFeedback: false,
currentIndex: controller.pageIndex,
items: items,
onTap: controller.changePageTo,
),
);
});
}
在dash_board_controller.dart中,我们在控制器中获取了changePageTo方法。它执行更新以完成页面刷新工作。
class DashBoardController extends GetxController {
var tabIndex = 0;
var getToNamedList = [
Routes.HOME,
Routes.ME,
];
final List<BottomNavigationBarItem> navTabList = <BottomNavigationBarItem>[
BottomNavigationBarItem(
activeIcon: ImageIcon(
AssetImage('assets/***.png'),
size: 24,
),
icon: ImageIcon(
AssetImage('assets/***.png'),
size: 24,
),
label: "Home",
),
BottomNavigationBarItem(
activeIcon: ImageIcon(
AssetImage('assets/***.png'),
size: 24,
),
icon: ImageIcon(
AssetImage('assets/***.png'),
size: 24,
),
// icon: Icon(Icons.person),
label: "Me",
),
];
void changePageTo(int index) {
tabIndex = index;
update();
}
}
您需要使用 Obx 包裹底部导航栏