GetX UI 状态在 ListTile 上没有改变

GetX UI state not changing on ListTile

我有一个 object 的列表,但我想将其中一个 object 的状态更改为“isLoading”,它会有不同的标题等。

我正在构建我的列表视图:

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        key: scaffoldKey,
        body: Obx(() => buildListView(context)));
  }

  Widget buildListView(BuildContext context) {
    return ListView.builder(
        itemCount: controller.saveGames.length,
        itemBuilder: (context, index) {
          final saveGame = controller.saveGames.elementAt(index);

          return saveGame.isLoading
              ? buildListTileIsLoading(context, saveGame)
              : buildListTile(context, saveGame);
        });
  }

  ListTile buildListTile(BuildContext context, SaveGame saveGame) {
    return ListTile(
      onTap: () => controller.process(saveGame)
    );
  }

控制器:

class SaveGameController extends GetxController {

  final RxList<SaveGame> saveGames = <SaveGame>[].obs;
  
  void process(SaveGame saveGame) {
    saveGame.working = true;

    update();
  }
  
}

我哪里错了?

编辑:添加了更多代码

所以尽管如此,我只是更新了列表中的一个对象并没有修改列表的内容(adding/removing 个对象)我仍然需要调用 saveGames.refresh();

我的疏忽认为如果您只是更改其中一个对象的 属性,则不需要刷新整个列表。

很高兴知道 :)

update()GetBuilder()

一起使用

obs()obx()

一起使用

您需要更改列表以更新小部件

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

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      onInit: () {
        Get.lazyPut(() => SaveGameController());
      },
      home: const HomePage(),
    );
  }
}

class HomePage extends GetView<SaveGameController> {
  const HomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(appBar: AppBar(), body: Obx(() => buildListView(context)));
  }

  Widget buildListView(BuildContext context) {
    return ListView.builder(
        itemCount: controller.saveGames.length,
        itemBuilder: (context, index) {
          final saveGame = controller.saveGames.elementAt(index);

          return buildListTile(context, saveGame);
        });
  }

  ListTile buildListTile(BuildContext context, SaveGame saveGame) {
    return ListTile(
        tileColor: saveGame.working ? Colors.red : Colors.yellow,
        title: Text(saveGame.name),
        onTap: () => controller.process(saveGame));
  }
}

class SaveGameController extends GetxController {
  final RxList<SaveGame> saveGames = <SaveGame>[
    SaveGame(id: 0, name: 'a', working: false),
    SaveGame(id: 1, name: 'b', working: false),
    SaveGame(id: 2, name: 'c', working: false)
  ].obs;

  void process(SaveGame saveGame) {
    final index = saveGames.indexWhere((element) => element.id == saveGame.id);
    saveGames
        .replaceRange(index, index + 1, [saveGame.copyWith(working: true)]);
  }
}

class SaveGame {
  final int id;
  final String name;
  final bool working;
  SaveGame({required this.id, required this.name, required this.working});
  SaveGame copyWith({int? id, String? name, bool? working}) {
    return SaveGame(
        id: id ?? this.id,
        name: name ?? this.name,
        working: working ?? this.working);
  }
}