我有一个提供程序正在侦听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
答案 0 :(得分:2)
这里有很多问题。
1.修复您的 PlayerList 声明行。
//CORRECT
class PlayerList extends ChangeNotifier {...}
//WRONG
class PlayerList with ChangeNotifier {...}
4.修复你的球员吸气剂线。
使用这个:
List<Player> get players => _players;
3.您需要更多关于提供商的概念知识。
基本上,Provider 使您的 PlayerList 可以从您提供它的小部件树中的任何位置访问。例如,您从 MaterialApp
的顶部提供。因此,您可以在 HomePage
或 Lobby
中访问它。
要访问您的 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;
}