如何使用flutter提供程序侦听列表中的更改?

时间:2020-05-31 20:08:46

标签: flutter flutter-provider

我有一个提供程序正在侦听playerList类的更改:

import 'package:flutter/material.dart';
import 'package:scam_artist/constants/PlayerColors.dart';
import 'package:scam_artist/models/Player.dart';

class PlayerList with ChangeNotifier {
  List<Player> _players = [];

  List<Player> get players {
    return [..._players];
  }

  void addPlayer(Key key, String name, int index) {
    _players.add(
        new Player(key: key, color: PlayerColors.colors[index], name: name));
    notifyListeners();
  }

  void editPlayerName(String newName, int index) {
    _players[index].name = newName;
    notifyListeners();
  }

  void editPlayerColor(Color newColor, int index) {
    _players[index].color = newColor;
    notifyListeners();
  }
}

但是,当我调用一个函数来将值更改为Player对象之一(例如更改名称)时,列表不会使用新数据更新该对象。

Player类是否需要其他提供者?如果是这样,我如何使PlayerList提供程序监听Player提供程序中的更改?

进行一些研究,我认为ProxyProvider可能是我想要的,但是我不确定如何实现它。

这对我有帮助{@ 1}}:

Player

这就是我创建import 'package:flutter/material.dart'; class Player { // id will be for database if implemented String uid; Key key; String name; //position is the order where the player plays int position; Color color; bool isTurn; bool isFakeArtist; bool isWinner; Player({this.key, this.name, this.color}); } 的地方:

ChangeNotifierProvider

2 个答案:

答案 0 :(得分:2)

这里有很多问题。

1.修复您的 PlayerList 声明行。

//CORRECT
class PlayerList extends ChangeNotifier {...}
//WRONG
class PlayerList with ChangeNotifier {...}

4.修复你的球员吸气剂线。

使用这个:

List<Player> get players => _players;

3.您需要更多关于提供商的概念知识。


基本上,Provider 使您的 PlayerList 可以从您提供它的小部件树中的任何位置访问。例如,您从 MaterialApp 的顶部提供。因此,您可以在 HomePageLobby 中访问它。

要访问您的 PlayerList,您必须使用 Consumer 小部件或 Selector 小部件,但对于您的情况,Consumer 就足够了。 Selector 用于高级用途。

这是从您的 PlayerList 读取实时值的代码。

class Lobby extends StatelessWidget {

  @override
  Widget build(BuildContext context) => Scaffold(
    body: _body(),
  );

  _body() => Container(
    child: Consumer<PlayerList>(
      builder: (BuildContext context, PlayerList bloc) => 
          ListView.builder(
            itemCount: bloc.players.length,
            itemBuilder: 
               (BuildContext context, int index) => Text(bloc.players[index].name),
          ),
    ),

  );

}

答案 1 :(得分:0)

只需更改您的 _players 访问器就可以了。

  List<Player> get players {
    return _players;
  }