首页 > 解决方案 > 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];
    ...
  }
}

标签: flutterflutter-getx

解决方案


可能你不能这样做,但你可以在它发生时更新你的用户界面。你能试试这个吗?

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];
...
    }
   }

推荐阅读