- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 Flutter 和 Getx 状态管理创建一个购物应用程序。我不知道如何为列表中的每个元素创建一个 Controller 。因此,列表中特定元素的任何更改只会重新加载该元素,而不是整个列表重新加载。
如果我单击“新订单”容器,其他容器(“订单已确认”、“已完成”)也会重建(整个 ListView 重建)。
我的型号:
import 'package:get/get.dart';
class TabModel {
late String tabName;
RxBool isSelected = false.obs;
TabModel(this.tabName);
}
我的 Controller :
import 'package:get/get.dart';
import 'package:super_mart_merchant/view/orders/view_models/tab_model.dart';
import 'package:collection/collection.dart';
class TabViewController extends GetxController{
RxList<TabModel> tabModels = <TabModel>[].obs;
@override
void onInit() {
super.onInit();
loadVal('New Order',true);
loadVal('Order Confirmed',false);
loadVal('Order Declined',false);
loadVal('Completed',false);
}
void loadVal(String name,bool isSelected){
TabModel tabModel = TabModel(name);
tabModel.isSelected.value = isSelected;
tabModels.add(tabModel);
}
void onClick(int pos){
TabModel tabModel = tabModels[pos];
if(!tabModel.isSelected.value){
TabModel? previousTabModel = tabModels.firstWhereOrNull((element) => element.isSelected.value);
if(previousTabModel != null){
previousTabModel.isSelected.value = false;
}
tabModel.isSelected.value = true;
}
}
}
捆绑:
import 'package:get/get.dart';
import 'package:super_mart_merchant/view/orders/controllers/tab_controller.dart';
class TabControllerBinding implements Bindings{
@override
void dependencies() {
Get.lazyPut<TabViewController>(() => TabViewController());
}
}
看法 :
class TabView extends StatelessWidget{
@override
Widget build(BuildContext context) {
return GetX<TabViewController>(
builder: (TabViewController tabController) {
print('Object called : ${tabController.toString()}');
return Container(
height: 55,
alignment: Alignment.center,
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemBuilder: (ctx, int index) {
if (tabController.tabModels[index].isSelected.value) {
return SelectedOrderStatusComponents(
tabController.tabModels[index],
index);
}
return GestureDetector(
onTap: (){
tabController.onClick(index);
},
child: UnSelectedOrderStatusComponents(
tabController.tabModels[index],
index),
);
},
itemCount: tabController.tabModels.length,
),
);
},
);
}
}
在 Provider 中,我们有这方面的选项。我不知道如何在 Getx 中做到这一点。万分感谢!!!。
最佳答案
这是我第一次在这里回答,所以我希望它符合标准,也不要太晚解决您的问题。
对于您的第一个问题:希望在选项卡中导航后防止每个选项卡重建。您可以将 Tab 小部件转换为有状态小部件并添加 AutomaticKeepAliveClientMixin
以防止它在导航后重建。像这样的东西:
class TabView extends StatefulWidget {
TabView ({Key? key}) : super(key: key);
@override
_TabViewState createState() => _TabViewState();
}
class _TabViewState extends State<TabView>
with AutomaticKeepAliveClientMixin {
@override
Widget build(BuildContext context) {
super.build(context);
return Container();
}
@override
bool get wantKeepAlive => true;
}
对于您的第二个问题,只需重新加载项目而不是整个列表,您可以将每个项目包装在
Obx
中。或
GetBuilder
并根据每个项目的索引或 id 给它一个标签,但我不建议这样做,因为 GetX 在重建方面非常快,它只会在更改的地方重建,并且在一个页面中有太多的 GetBuilder 会影响性能。
return GestureDetector(
onTap: (){
tabController.onClick(index);
},
child: GetBuilder<TabViewController>(
id: "item" + tabController.tabModels[index].id,
builder: (controller) {
return UnSelectedOrderStatusComponents(
tabController.tabModels[index],
index);
}
)
);
关于Flutter 和 Getx 状态管理 - ListView 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68611062/
我正在学习自己的 Flutter GetX 并坚持了一点。实际上我想知道为什么当我再次访问该页面/对话框时不会调用 GetX Controlled 的 onInit 方法。 假设我有一个简单的Text
当我发现自己多次调用同一个 getter 方法时,这应该被认为是一个问题吗? [总是] 分配给局部变量并只调用一次是否更好? 我确定答案当然是“视情况而定”。 我更关心更简单的情况,其中 getter
我可以使用 GetX 看到导航器堆栈吗?我查看了文档,但找不到有关此主题的任何内容。我通常会关闭例如这样的对话框 Get.until((route) => !Get.isDialogOpen); 但我
我想制作一个密码文本框,其中的内容可见性可以通过后缀图标来控制。 代码可能是这样的: import 'package:flutter/material.dart'; import 'package:g
我想使用 Get 包将多个数据从一个屏幕传递到另一个屏幕。 Get.to(Second(), arguments: ["First data", "Second data"]); 最佳答案 步骤:1
这是getX来自的vector.js var Vector = (function () { function Vector(pX, pY) { this.setX(pX);
让我们假设一个 ImageView,当它被添加到我的布局(相对布局)时,没有缩放(比例为 1)。如果我调用 getX(),它会返回正确的 X 位置。 但是,如果我现在用 2 调用 setScaleX(
我有一个这样的列表: List countries = [ Country(name: 'United States', border: ['Mexico', 'Canada']),
我正在为我的新项目尝试 GetX,并尝试使用受启发的 AnimationController this comment . Tween -> blur & spread & AnimationCont
应用程序一直卡在启动画面上的原因是什么?我使用 getx 状态管理。如果 authToken 不为空,它应该转到主页。但是 Controller 类中的 onInit 没有调用。 void main(
我隔离了一些繁重的计算,然后在接收到结果的列表时运行一个 for 循环以将它们添加到带有 items var items = [].obs;的可观察列表中; 问题是我正在尝试从启动 Controlle
我正在使用 Get.snackbar() 来显示连接到 API 的过程。我不明白如何以编程方式关闭 snackbar ?我有以下代码: @override Future getImportantD
我正在尝试在 ListView 中无限滚动。我正在从 API 获取数据。我正在使用 getx。我的 ListView 总是在滚动结束时重建。我找不到我做错的地方。 This is what i try
我使用 flutter 有一段时间了,最近使用 Get 来实现状态管理。 我在打开加载对话框 1 和消息对话框时遇到问题。然后我想关闭加载对话框,但消息对话框是保持关闭的对话框。 import '
我正在寻找如何在 GetX 的最佳实践中处理表单和验证的示例? 有没有很好的例子,或者有人可以向我展示我们如何最好地做到这一点的例子? 最佳答案 GetX 不是所有问题的解决方案,但它有一些实用方法可
我正在尝试将旧代码转换为新代码语法。我对 RxList 有疑问。 所以我改变了postModel.assign(postDetail); 但是在我的 news_detail 页面中我如何获取值(val
我想在单击图 block 时更改 ListTile 文本的颜色,我该怎么做,而且颜色应该只针对特定的选定图 block 更改。我的方法如下: ListView.builder( ite
在下面的代码中,为什么首先执行 getX() 方法而不是构造函数: public class ConsructorQuestion { int x = getX(); // same thi
我正在尝试将旧代码转换为新代码语法。我对 RxList 有疑问。 所以我改变了postModel.assign(postDetail); 但是在我的 news_detail 页面中我如何获取值(val
我想在单击图 block 时更改 ListTile 文本的颜色,我该怎么做,而且颜色应该只针对特定的选定图 block 更改。我的方法如下: ListView.builder( ite
我是一名优秀的程序员,十分优秀!