ListList抖动时onPressed的问题

问题描述 投票:0回答:1

当我按下按钮时,所有按钮的颜色都会改变。我将变量初始化为true。当我单击时,此值将采用此值并更改颜色。

为什么所有值都改变?我认为我将按下的变量放在了不好的地方。

编辑:

class PollPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _Poll();
  }
}

class _Poll extends State<PollPage> {
  List<String> choix = [];


  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: Text("Blackblox"),
        leading: Image.asset(
          'assets/img/logo_ineat.png',
          fit: BoxFit.contain,
          height: 32,
        ),
      ),
      body: new Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            new Flexible(
              child: new Container(
                child: new FutureBuilder<List<PollQuestionsDto>>(
                    future: Poll().getPollQuestions(),
                    builder: (BuildContext context, AsyncSnapshot snapshot) {
                      if (snapshot.hasData) {
                        if (snapshot.data != null) {
                          return new Column(
                            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                            children: <Widget>[
                              new Expanded(
                                child: new ListView.builder(
                                  itemCount: snapshot.data.length,
                                  itemBuilder: (BuildContext context, index) {
                                    return PollListViewItem(
                                      entitled: snapshot.data[index].entitled,
                                      answers: snapshot.data[index].answers,
                                    );
                                  },
                                ),
                              ),
                            ],
                          );
                        }
                      } else {
                        new Text("Loading...");
                        return new CircularProgressIndicator();
                      }
                    }),
              ),
            ),
            new _AnimatedLiquidLinearProgressIndicator(),
            new Container(
              margin: EdgeInsets.only(right: 10.0),
              child: new RaisedButton.icon(
                onPressed: () {
                  Navigator.pushReplacement(context,
                      MaterialPageRoute(builder: (context) => PollPage()));
                  //TechnologyPage(listThemes: themes)));
                },
                label: Text('Suivant'),
                icon: Icon(Icons.navigate_next),
              ),
              alignment: Alignment.bottomRight,
            ),
          ],
        ),
      ),
    );
  }
}
class PollListViewItem extends StatefulWidget {
  final String entitled;
  final int id;
  final int difficulty;
  final List<Answer> answers;

  const PollListViewItem(
      {Key key, this.id, this.entitled, this.difficulty, this.answers})
      : super(key: key);

  @override
  _PollListViewItemState createState() => _PollListViewItemState();
}
class _PollListViewItemState extends State<PollListViewItem> {
var pressed = true;
  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: <Widget>[
        new Container(
            margin: EdgeInsets.only(top: 10.0, bottom: 10.0, left: 10),
            child: new Text(widget.entitled,
                style:
                    new TextStyle(fontSize: 24, fontWeight: FontWeight.bold)),
            alignment: Alignment.topCenter),
        new Flexible(
          child: new Container(
            child: new Column(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                for (var answer in widget.answers)
                  new Container(
                    margin: EdgeInsets.only(top: 10.0, bottom: 10.0),
                    child : new ButtonTheme(
                      minWidth: 200.0,
                      height: 100.0,
                      child: new RaisedButton(
                        color: pressed ? Colors.pink[100] : Colors.pink,
                        hoverColor: Colors.pinkAccent,
                        focusColor: Colors.pinkAccent,
                        child: new Text(answer.entitled),
                        onPressed: () => setState(() {
                          pressed = !pressed;
                        }),
                      ),
                    ),
                  ),
              ],
            ),
          ),
        ),
      ],
    );
  }
}

当我单击列表中的一个元素时,所有元素都会更改颜色。

android mobile flutter flutter-layout
1个回答
0
投票

我认为这可能有效:

将按钮列表放入ListView.builder中,以便您可以传递索引。详细信息在这里:https://api.flutter.dev/flutter/widgets/ListView-class.html#widgets.ListView.2

myRaisedButton(index) {
  RaisedButton(
    color: pressed ? Colors.pink[100] : Colors.pink,
    hoverColor: Colors.pinkAccent,
    focusColor: Colors.pinkAccent,
    child: new Text(answer.entitled),
    onPressed: () => setState(() {
      pressed = !pressed;
    }),
  );
}

然后:

  var pressed = true;

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: <Widget>[
        new Container(
            margin: EdgeInsets.only(top: 10.0, bottom: 10.0, left: 10),
            child: new Text(widget.entitled,
                style:
                    new TextStyle(fontSize: 24, fontWeight: FontWeight.bold)),
            alignment: Alignment.topCenter),
        new Flexible(
          child: new Container(
            child: new Column(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                for (var answer in widget.answers)
                  new Container(
                    margin: EdgeInsets.only(top: 10.0, bottom: 10.0),
                    child :     ListView.builder(
    padding: const EdgeInsets.all(8),
    itemCount: entries.length,
    itemBuilder: (BuildContext context, int index) {
    return myRaisedButton(index);  <--- Here



© www.soinside.com 2019 - 2024. All rights reserved.