当我更改 ObservableList 中的属性时,如何更新 mobx?

问题描述 投票:0回答:2

我目前一直在为我的 flutter 应用程序使用 mobx,并且我正在尝试更新 ListTile 以更改其点击时的颜色。现在我有一个标有@observable的ObservableList,以及一个更改该列表中项目的属性的@action。

class TestStore = TestStoreBase with _$TestStore;

abstract class TestStoreBase with Store {
  final DataService _dataService;

  TestStoreBase({
    @required DataService dataService,
  })  : assert(dataService != null),
        _dataService = dataService,
        players = ObservableList<Player>();

  @observable
  ObservableList<Player> players;

  @action
  Future<void> loadPlayers(User user) async {
    final userPlayers = await _dataService.getUserPlayers(user);
    players.addAll(userPlayers);
  }

  @action
  void selectPlayer(int index) {
    players[index].isSelected = !players[index].isSelected;
    );
  }
}

在我的用户界面中,我在列表构建器中有这个:

return Observer(builder: (_) {
    return Container(
        color: widget.testStore.players[index].isSelected != null &&
                widget.testStore.players[index].isSelected
                    ? Colors.pink
                    : Colors.transparent,
        child: ListTile(
               leading: Text(widget.testStore.players[index].id),
               onTap: () => widget.testStore.selectPlayer(index),
             ),
           );
        });

但是当我调用 widget.testStore.selectPlayer(index); 时它不会重画

我尝试的第二件事是在 isSelected bool 的“Players”类中添加 @observable,但它似乎也不起作用。

@JsonSerializable()
class Player {
  final String id;
  final bool isUser;

  @observable
  bool isSelected;

  Player(this.id, this.isUser, this.isSelected);

  factory Player.fromJson(Map<String, dynamic> data) => _$PlayerFromJson(data);

  Map<String, dynamic> toJson() => _$PlayerToJson(this);
}

任何帮助将不胜感激,谢谢!

flutter dart mobx
2个回答
1
投票

您正在尝试对

isSelected
属性执行操作,因此基本上您还必须将
Player
类定义为 MobX 存储,并创建一个在修改
reportWrite()
时触发
isSelected
的 mixin。

@observable
属性上添加
players
注释仅意味着在属性本身上观看,而输入
players
作为
ObservableList
则意味着在属性的列表元素上观看,即在players[0]上观看,玩家[1]...等等。

例如

@JsonSerializable()
class Player = _Player with _$Player;

abstract class _Player with Store {
  final String id;
  final bool isUser;

  @observable
  bool isSelected;

  _Player(this.id, this.isUser, this.isSelected);

  factory _Player.fromJson(Map<String, dynamic> data) => _$PlayerFromJson(data);

  Map<String, dynamic> toJson() => _$PlayerToJson(this);
}

这是来自 MobX 的 GitHub 存储库的类似问题:https://github.com/mobxjs/mobx.dart/issues/129


0
投票

可以分享一下数据服务文件吗?它会帮助我

© www.soinside.com 2019 - 2024. All rights reserved.