Flutter:使用 GetX

问题描述

我正在根据 toDoId 的数量创建 List of Cards

toDoController.toDo() 就像

toDo = [q1,r4,g4,d4].obs;

而且,这是我的 ListView.builder()

  Obx(() {
         List _todo = toDoController.toDo();

         return ListView.builder(
         shrinkWrap: true,scrollDirection: Axis.horizontal,itemCount: _todo.length,itemBuilder: (BuildContext context,int i) {
                           
         var _loading = true;
         var _title = 'loading';
                          
         getTodoInfo() async {
         _title = await toDoController
                .getTodoInfo(
                     _todo[i]
                 );
         _loading = false;
         print(_title); // 'Clean!' <--- returns correct title
         }

         getTodoInfo();

         return Container(
           height: 150,width: 150,child: _loading
           ? Text(
             _title,)
             : Text(
             _title,),);
    },);
  })

我试图让每个 Container 调用 http requests 以从我的数据库中获取标题。获取标题,然后更新到下面的 Text() 小部件。但是,从服务器返回值后,它不会更新。

我可以使用 FutureBuilder 让他们等待获取标题的请求。我也尝试过 FutureBuilder。但是,FutureBuilder 也不会对 variable 的变化做出反应。所以,我试图在这里做到这一点。我有点明白了。之后,widget 返回了,是不是不可更改?有什么办法可以用 GetX 做到这一点吗?

解决方法

这是一个将 GetX 与 Listview.builder 结合使用的示例。

此示例使用 GetBuilder 而不是 Obx,因为我不确定使用流会增加任何好处。如果由于某种原因需要观察/流,numbers 可以更新为 .obs 并且应该删除 update() 调用并将 GetBuilder 替换为 GetXObx。如果有人问,我会将其添加为替代示例。

GetBuilder 包装了 ListView.builder 并且只会重建 ListView,而不是整个小部件树/页面。

import 'package:flutter/material.dart';
import 'package:get/get.dart';

class ListDataX extends GetxController {
  List<int> numbers = List<int>.from([0,1,2,3]);

  void httpCall() async {
    await Future.delayed(Duration(seconds: 1),() => numbers.add(numbers.last + 1)
    );
    update();
  }

  void reset() {
    numbers = numbers.sublist(0,3);
    update();
  }
}

class GetXListviewPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    ListDataX dx = Get.put(ListDataX());
    print('Page ** rebuilt');
    return Scaffold(
      body: SafeArea(
        child: Column(
          children: [
            Expanded(
              flex: 8,child: GetBuilder<ListDataX>(
                builder: (_dx) => ListView.builder(
                    itemCount: _dx.numbers.length,itemBuilder: (context,index) {
                      return ListTile(
                        title: Text('Number: ${_dx.numbers[index]}'),);
                    }),),Expanded(
              flex: 1,child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: [
                    RaisedButton(
                      child: Text('Http Request'),onPressed: dx.httpCall,RaisedButton(
                      child: Text('Reset'),onPressed: dx.reset,)
                  ],)
            )
          ],);
  }
}
,

我没有测试过,因为我没有完整的样本,但我认为这就是你要找的:

FutureBuilder<String>(
  future: toDoController.getTodoInfo(_todo[i]),builder: (BuildContext context,AsyncSnapshot<String> snapshot) {
    if (snapshot.hasData) {
      return Container(
        height: 150,width: 150,child: Text(snapshot.data),);
    } else if (snapshot.hasError) {
      return Text('Error');
    } else {
      return CircularProgressIndicator();
    }
  },

这是您需要为列表构建器的每个项目返回的代码。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...