如何从列表中的其他项触发ListView刷新
我搜索了档案,发现了几个关于这个主题的问题,但没有一个问题与我的问题完全相符。我在ListView中有一个玩家列表,其中还包括一个图标按钮、一个字符串名称和一个复选框。我想模拟单选按钮的行为(即,互斥属性,其中只有一个按钮可以选择,按下一个按钮将关闭任何其他选定的“按钮”)。“单选按钮”用于指示谁是团队的“队长”。小组中只能有一名队长。默认屏幕将显示选择的第一名玩家,按另一行将突出显示该选择,但是,第一名不会“取消选择”。按下第一个名称的复选框将取消该行的高亮显示,并“下拉列表”并使用刷新指示器。但只需按下图标按钮对其他行没有影响 我已经看过几个关于向列表中添加项目和自动刷新ListView的主题,但是我找不到任何关于在从其他行激活onPressed函数时更新列表中其他项目的信息。我曾尝试添加didChangeDependencies,认为这可能会更新其他listView项,但我也无法实现 是否有一些我缺少的可以实现此功能的设置如何从列表中的其他项触发ListView刷新,listview,flutter,Listview,Flutter,我搜索了档案,发现了几个关于这个主题的问题,但没有一个问题与我的问题完全相符。我在ListView中有一个玩家列表,其中还包括一个图标按钮、一个字符串名称和一个复选框。我想模拟单选按钮的行为(即,互斥属性,其中只有一个按钮可以选择,按下一个按钮将关闭任何其他选定的“按钮”)。“单选按钮”用于指示谁是团队的“队长”。小组中只能有一名队长。默认屏幕将显示选择的第一名玩家,按另一行将突出显示该选择,但是,第一名不会“取消选择”。按下第一个名称的复选框将取消该行的高亮显示,并“下拉列表”并使用刷新指示器
import 'package:flutter/material.dart';
Group group;
class Player {
String name;
bool captain;
bool press;
Player({this.captain, this.name, this.press});
}
class Group {
List<Player> players = [];
void addNewPlayer(String name, bool banker, bool pressing) {
final player = Player(name: name, captain: banker, press: pressing);
players.add(player);
}
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(title: 'Players'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({this.title});
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
void initState() {
// TODO: implement initState
super.initState();
group = Group();
for (int i = 1; i <= 4; i++) {
group.addNewPlayer('Player $i', i == 1, false);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: RefreshIndicator(
child: ListLayout(),
onRefresh: _handleRefresh,
),
);
}
Future<Null> _handleRefresh() async {
setState(() {
ListLayout();
});
return null;
}
}
class PlayerCard extends StatefulWidget {
final int curPlayer;
final Group group;
PlayerCard({Key key, this.group, this.curPlayer}) : super(key: key);
@override
_PlayerCardState createState() => _PlayerCardState();
}
class _PlayerCardState extends State<PlayerCard> {
@override
void didChangeDependencies() {
super.didChangeDependencies();
setState(() {
ListLayout();
});
}
@override
Widget build(BuildContext context) {
var group = widget.group;
var curPlayer = widget.curPlayer;
return Container(
child: Card(
color:
group.players[curPlayer].captain ? Colors.lightBlue : Colors.white,
child: Row(
children: <Widget>[
IconButton(
icon: Icon(Icons.adjust),
onPressed: () {
setState(() {
for (int i = 0; i < group.players.length; i++) {
group.players[i].captain = (i == widget.curPlayer);
}
didChangeDependencies();
});
},
),
Expanded(
child: Column(
children: <Widget>[
Text(
group.players[curPlayer].name,
),
],
),
),
Expanded(
flex: 1,
child: Checkbox(
value: group.players[curPlayer].press,
onChanged: (value) {
setState(
() {
group.players[curPlayer].press = value;
},
);
},
),
),
],
),
),
);
}
}
class ListLayout extends StatefulWidget {
@override
_ListLayoutState createState() => _ListLayoutState();
}
class _ListLayoutState extends State<ListLayout> {
@override
Widget build(BuildContext context) {
return ListView.builder(
shrinkWrap: true,
itemCount: group.players.length,
itemBuilder: (context, index) {
return PlayerCard(
curPlayer: index, group: group, key: ValueKey(group));
});
}
}
导入“包装:颤振/材料.省道”;
组;
职业选手{
字符串名;
布尔船长;
布尔出版社;
玩家({this.captain,this.name,this.press});
}
班级{
列出参与者=[];
void addNewPlayer(字符串名称、bool banker、bool pressing){
最终玩家=玩家(姓名:姓名,队长:银行家,按:按);
players.add(player);
}
}
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:我的主页(标题:“玩家”),
);
}
}
类MyHomePage扩展StatefulWidget{
我的主页({this.title});
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
@凌驾
void initState(){
//TODO:实现initState
super.initState();
组=组();
对于(int i=1;i_PlayerCardState();
}
类_PlayerCardState扩展状态{
@凌驾
void didChangeDependencies(){
super.didChangeDependencies();
设置状态(){
ListLayout();
});
}
@凌驾
小部件构建(构建上下文){
var group=widget.group;
var curPlayer=widget.curPlayer;
返回容器(
孩子:卡片(
颜色:
组。玩家[curPlayer]。队长?颜色。浅蓝色:颜色。白色,
孩子:排(
儿童:[
图标按钮(
图标:图标(图标。调整),
已按下:(){
设置状态(){
对于(int i=0;i\u ListLayoutState();
}
类_ListLayoutState扩展状态{
@凌驾
小部件构建(构建上下文){
返回ListView.builder(
收缩膜:对,
itemCount:group.players.length,
itemBuilder:(上下文,索引){
还击牌(
curPlayer:index,group:group,key:ValueKey(group));
});
}
}
您可以复制粘贴运行下面的完整代码您可以将
列表布局状态中的回调刷新()
传递给播放卡
在PlayerCard
调用widget.callback()
代码片段
class PlayerCard extends StatefulWidget {
...
final VoidCallback callback;
PlayerCard({Key key, this.group, this.curPlayer, this.callback})
: super(key: key);
...
onPressed: () {
setState(() {
...
widget.callback();
class _ListLayoutState extends State<ListLayout> {
void refresh() {
setState(() {});
}
...
return PlayerCard(
curPlayer: index,
group: group,
key: ValueKey(group),
callback: refresh,
);
class PlayerCard扩展StatefulWidget{
...
最终无效回调;
PlayerCard({Key,this.group,this.curPlayer,this.callback})
:super(key:key);
...
已按下:(){
设置状态(){
...
widget.callback();
类_ListLayoutState扩展状态{
无效刷新(){
setState((){});
}
...
还击牌(
玩家:索引,
组:组,,
键:ValueKey(组),
回调:刷新,
);
工作演示
完整代码
import 'package:flutter/material.dart';
Group group;
class Player {
String name;
bool captain;
bool press;
Player({this.captain, this.name, this.press});
}
class Group {
List<Player> players = [];
void addNewPlayer(String name, bool banker, bool pressing) {
final player = Player(name: name, captain: banker, press: pressing);
players.add(player);
}
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(title: 'Players'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({this.title});
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
void initState() {
// TODO: implement initState
super.initState();
group = Group();
for (int i = 1; i <= 4; i++) {
group.addNewPlayer('Player $i', i == 1, false);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: RefreshIndicator(
child: ListLayout(),
onRefresh: _handleRefresh,
),
);
}
Future<Null> _handleRefresh() async {
setState(() {
ListLayout();
});
return null;
}
}
class PlayerCard extends StatefulWidget {
final int curPlayer;
final Group group;
final VoidCallback callback;
PlayerCard({Key key, this.group, this.curPlayer, this.callback})
: super(key: key);
@override
_PlayerCardState createState() => _PlayerCardState();
}
class _PlayerCardState extends State<PlayerCard> {
/*@override
void didChangeDependencies() {
super.didChangeDependencies();
setState(() {
ListLayout();
});
}*/
@override
Widget build(BuildContext context) {
var group = widget.group;
var curPlayer = widget.curPlayer;
return Container(
child: Card(
color:
group.players[curPlayer].captain ? Colors.lightBlue : Colors.white,
child: Row(
children: <Widget>[
IconButton(
icon: Icon(Icons.adjust),
onPressed: () {
setState(() {
for (int i = 0; i < group.players.length; i++) {
group.players[i].captain = (i == widget.curPlayer);
}
widget.callback();
//didChangeDependencies();
});
},
),
Expanded(
child: Column(
children: <Widget>[
Text(
group.players[curPlayer].name,
),
],
),
),
Expanded(
flex: 1,
child: Checkbox(
value: group.players[curPlayer].press,
onChanged: (value) {
setState(
() {
group.players[curPlayer].press = value;
},
);
},
),
),
],
),
),
);
}
}
class ListLayout extends StatefulWidget {
@override
_ListLayoutState createState() => _ListLayoutState();
}
class _ListLayoutState extends State<ListLayout> {
void refresh() {
setState(() {});
}
@override
Widget build(BuildContext context) {
return ListView.builder(
shrinkWrap: true,
itemCount: group.players.length,
itemBuilder: (context, index) {
return PlayerCard(
curPlayer: index,
group: group,
key: ValueKey(group),
callback: refresh,
);
});
}
}
导入“包装:颤振/材料.省道”;
组;
职业选手{
字符串名;
布尔船长;
布尔出版社;
玩家({this.captain,this.name,this.press});
}
班级{
列出参与者=[];
void addNewPlayer(字符串名称、bool banker、bool pressing){
最终玩家=玩家(姓名:姓名,队长:银行家,按:按);
players.add(player);
}
}
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:我的主页(标题:“玩家”),
);
}
}
类MyHomePage扩展StatefulWidget{
我的主页({this.title});
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
@凌驾
void initState(){
//TODO:实现initState
super.ini