如何访问和更改列表中特定窗口小部件的属性值

时间:2019-08-09 17:01:49

标签: flutter flutter-listview

`List<Widget> _dataList = [
    DataCard(
      start: 0,
      end: 6,
    ),
    DataCard(
      start: 2,
      end: 8,
    ),
    DataCard(
      start: 4,
      end: 20,
    )
  ];`

dataCard基本上返回一个GestureDetector小部件,其中Card小部件显示开始和结束值。

我想要做的是在屏幕上显示小部件后更改开始/结束的值。如何访问列表中任何dataCard的属性?

这是DataCard类:

class DataCard extends StatelessWidget {
  DataCard({this.start, this.end, this.key});
  final int start;
  final int end;
  final Key key;
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        print(key);
      },
      child: Card(
        key: key,
        child: Padding(
          padding: const EdgeInsets.all(20.0),
          child: Column(
            children: <Widget>[
              Text(
                'Start: $start',
                style: TextStyle(
                  fontSize: 40,
                ),
              ),
              Text(
                'End: $end',
                style: TextStyle(
                  fontSize: 40,
                ),
              ),
            ],
          ),
        ),
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(10),
        ),
      ),
    );
  }
}

可视化: enter image description here


例如,当我单击“浮动动作按钮”时,我只想更改第二个DataCard小部件的开始和结束值。有没有办法做到这一点?谢谢!

最终目标是使用户能够向列表中添加DataCard,其中开始和结束值也由他们确定。之后,DataCard的值将在没有用户干预的情况下进行调整。

1 个答案:

答案 0 :(得分:3)

您的问题与称为应用程序状态管理的大主题有关。

从有状态小部件,继承的小部件,提供程序包和BLoC模式开始了解它。 (从最简单到最困难)

这是由flutter团队制作的有关有状态小部件https://youtu.be/AqCMFXEmf3w的视频。

回到您的问题,使用有状态小部件的简单示例:

class _MyHomePageState extends State<MyHomePage> {
  var list = <List<int>>[
    [1, 6],
    [2, 8],
    [4, 20]
  ];

  void _incrementSecondCardStartParametr() {
    setState(() {
      list[1][0] += 1;
    });
  }

  Function decrementEndParametr(idx) =>  () => setState((){
      list[idx][1] -= 1;
    });

  @override
  Widget build(BuildContext context) {
    List<Widget> _widgets = list
        .map((data) => DataCard(
              start: data[0],
              end: data[1],
              decrementEndParametr: decrementEndParametr(list.indexOf(data))
            ))
        .toList();

    return Scaffold(
      appBar: AppBar(
        title: Text('List Example'),
      ),
      body: Center(
        child: Column(children: _widgets),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementSecondCardStartParametr,
        child: Icon(Icons.add),
      ),
    );
  }
}

    class DataCard extends StatelessWidget {
DataCard({this.start, this.end, this.key, this.decrementEndParametr});

final Function decrementEndParametr;
..
@override
Widget build(BuildContext context) {
  return GestureDetector(
    onTap: decrementEndParametr,
..

qu