Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从列表中的其他项触发ListView刷新_Listview_Flutter - Fatal编程技术网

如何从列表中的其他项触发ListView刷新

如何从列表中的其他项触发ListView刷新,listview,flutter,Listview,Flutter,我搜索了档案,发现了几个关于这个主题的问题,但没有一个问题与我的问题完全相符。我在ListView中有一个玩家列表,其中还包括一个图标按钮、一个字符串名称和一个复选框。我想模拟单选按钮的行为(即,互斥属性,其中只有一个按钮可以选择,按下一个按钮将关闭任何其他选定的“按钮”)。“单选按钮”用于指示谁是团队的“队长”。小组中只能有一名队长。默认屏幕将显示选择的第一名玩家,按另一行将突出显示该选择,但是,第一名不会“取消选择”。按下第一个名称的复选框将取消该行的高亮显示,并“下拉列表”并使用刷新指示器

我搜索了档案,发现了几个关于这个主题的问题,但没有一个问题与我的问题完全相符。我在ListView中有一个玩家列表,其中还包括一个图标按钮、一个字符串名称和一个复选框。我想模拟单选按钮的行为(即,互斥属性,其中只有一个按钮可以选择,按下一个按钮将关闭任何其他选定的“按钮”)。“单选按钮”用于指示谁是团队的“队长”。小组中只能有一名队长。默认屏幕将显示选择的第一名玩家,按另一行将突出显示该选择,但是,第一名不会“取消选择”。按下第一个名称的复选框将取消该行的高亮显示,并“下拉列表”并使用刷新指示器。但只需按下图标按钮对其他行没有影响

我已经看过几个关于向列表中添加项目和自动刷新ListView的主题,但是我找不到任何关于在从其他行激活onPressed函数时更新列表中其他项目的信息。我曾尝试添加didChangeDependencies,认为这可能会更新其他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