flutter - Getx 等待构建列表
问题描述
我有一个方法需要在构造ListView.builder之前先执行来获取项目,如何保持这个方法总是在ListView之前执行?
class TestModel extends GetxController {
final items = <Item>[].obs;
void init() async {
items.value = getRemoteItems();
}
}
class TestScreen extends StatelessWidget {
final TestModel testModel = Get.put(TestModel());
@override
Widget build(BuildContext context) {
if (testModel.items.isEmpty) {
testModel.init(); // It seems the ListView can not get the testModel's items.
}
return Obx(
() => ListView.builder(
itemCount: testModel.items.length, // But the items length is always 0.
itemBuilder: (context, index) {
final item = testModel.items[index];
...
}
}
解决方案
可能你不能这样做,但你可以在它发生时更新你的用户界面。你能试试这个吗?
class TestModel extends GetxController {
final items = <Item>[];
String token = ''; //if it's dynamic, don't do this...
void onInit() {
// this runs your method at the beginning
// but if you wanna aviod this,
// you can remove here.
foo();
}
void foo(
String token //...do this and run this with token.
) async {
items.value = await getRemoteItems(token);
update();
}
}
class TestScreen extends StatelessWidget {
final TestModel testModel = Get.put(TestModel());
@override
Widget build(BuildContext context) {
if (testModel.items.isEmpty) {
testModel.foo();
return Container(); // or loading screen.
}
return GetxController<TestModel>(
builder: (_) => ListView.builder(
itemCount: _.items.length,
itemBuilder: (context, index) {
final item = _.items[index];
...
}
}
推荐阅读
- google-sheets - 如何防止 Google 电子表格翻译函数名称?
- python - 单击动态按钮不起作用(python)
- windows - 哪些交换机可以在没有人工干预的情况下运行安装程序?
- typescript - 忽略或覆盖构造函数定义的参数
- django - Django-allauth - 使用 AbstractUser 添加其他字段
- c - printf 转换的正确规则是什么?
- ios - FirebaseUI/PhoneAuth/FirebasePhoneAuthUI/FUICodeField.xib:-1:未能找到或创建描述的执行上下文
- javascript - 堆积条形图比例不一致问题
- angular - 如何仅在休眠中更新 JSON 定义的属性
- clojure - RabbitMQ:客户端未收到客户端启动前发送的消息