【问题标题】:Flutter/Dart: update some variables but not others when using setState()Flutter/Dart:使用 setState() 时更新一些变量但不更新其他变量
【发布时间】:2019-12-11 04:58:42
【问题描述】:

我正在努力提高对 Flutter 的理解,并且正在努力解决一个问题。我正在尝试创建一个应用程序,该应用程序显示从列表中提取数据的卡片列表。底部有一个按钮,当用户单击它时会创建一张新卡片。

我试图让每张卡片显示一个唯一的“整数”。因此,例如,每次用户单击按钮时,都会添加一张卡片,该卡片会在单词“Round”旁边显示序号。第 1 轮 > 第 2 轮 > 第 3 轮,依此类推。

现在一切正常,只是每次按下按钮时,所有卡片都会更新为最新数字。因此,每张卡都更新为最新的轮数,而不是获取卡的顺序列表。

我做错了什么?谢谢。

这是我的代码:


import 'package:flutter/material.dart';

class Round {

  int roundNumber;
  int firstNumber;
  int secondNumber;

  Round({ this.roundNumber, this.firstNumber, this.secondNumber, });

}

int uid = 1;

List<Round> roundsList = [
  Round(roundNumber: uid, firstNumber: 1, secondNumber: 2),
];


class createLevels extends StatefulWidget {
  @override
  _createLevelsState createState() => _createLevelsState();
}

class _createLevelsState extends State<createLevels> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
          title: Text("Create Rounds",)
      ),
      body: Padding(
        padding: const EdgeInsets.fromLTRB(20, 20, 20.0, 20),
        child: Container(
          child: Column(
              children: <Widget>[
                Expanded(
                  child: ListView.builder(
                    itemCount: roundsList.length,
                      itemBuilder: (BuildContext context, int whatIsThisVariable) {
                      return roundCard(Round(roundNumber: uid, firstNumber: 2, secondNumber: 3,));
                      }
                  ),
                ),
                Text("$roundsList"),
                RaisedButton(
                  onPressed: () {
                    uid++;
                    roundsList.add(Round(roundNumber: uid));
                    setState(() {});
                  },
                    child: Text("Add Round"),
                ),
              ],
          ),
        ),
      ),
    );
  }
}

class roundCard extends StatelessWidget {

  final Round round;

  roundCard(this.round);

  // roundsList.add(Round(roundNumber: 1));

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Card(
          child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: <Widget>[
                Spacer(
                  flex: 1,
                ),
                Expanded(
                  child: Text('Round ${round.roundNumber}:'),
                  flex: 12,
                ),
                Expanded(
                  child: TextFormField(
                      textAlign: TextAlign.center,
                      decoration: InputDecoration(
                        hintText: '${round.firstNumber}',
                      ),
                  ),
                  flex: 3,
                ),
                Spacer(
                  flex: 1,
                ),
                Expanded(
                  child: TextFormField(
                      textAlign: TextAlign.center,
                      decoration: InputDecoration(
                        hintText: '${round.secondNumber}',
                      ),
                  ),
                  flex: 3,
                ),
              ],
            ),
          )
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart setstate


    【解决方案1】:

    您可以在下面复制粘贴运行完整代码
    你需要通过index 而不是uid
    你可以调整你想要的第一个和第二个数字

    代码sn-p

    itemBuilder: (BuildContext context, int index) {
                      return roundCard(roundsList[index]);
                    }),
    ...
    onPressed: () {
                      uid++;
                      firstNumber++;
                      secondNumber++;
                      roundsList.add(
                          Round(roundNumber: uid, firstNumber: firstNumber, secondNumber: secondNumber));
                      setState(() {});
                    }
    

    工作演示

    完整代码

    import 'package:flutter/material.dart';
    
    class Round {
      int roundNumber;
      int firstNumber;
      int secondNumber;
    
      Round({
        this.roundNumber,
        this.firstNumber,
        this.secondNumber,
      });
    }
    
    int uid = 1;
    int firstNumber = 2;
    int secondNumber = 3;
    
    List<Round> roundsList = [
      Round(roundNumber: uid, firstNumber: 1, secondNumber: 2),
    ];
    
    class createLevels extends StatefulWidget {
      @override
      _createLevelsState createState() => _createLevelsState();
    }
    
    class _createLevelsState extends State<createLevels> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
              centerTitle: true,
              title: Text(
                "Create Rounds",
              )),
          body: Padding(
            padding: const EdgeInsets.fromLTRB(20, 20, 20.0, 20),
            child: Container(
              child: Column(
                children: <Widget>[
                  Expanded(
                    child: ListView.builder(
                        itemCount: roundsList.length,
                        itemBuilder: (BuildContext context, int index) {
                          return roundCard(roundsList[index]);
                        }),
                  ),
                  Text("$roundsList"),
                  RaisedButton(
                    onPressed: () {
                      uid++;
                      firstNumber++;
                      secondNumber++;
                      roundsList.add(
                          Round(roundNumber: uid, firstNumber: firstNumber, secondNumber: secondNumber));
                      setState(() {});
                    },
                    child: Text("Add Round"),
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }
    
    class roundCard extends StatelessWidget {
      final Round round;
    
      roundCard(this.round);
    
      // roundsList.add(Round(roundNumber: 1));
    
      @override
      Widget build(BuildContext context) {
        return Container(
          child: Card(
              child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: <Widget>[
                Spacer(
                  flex: 1,
                ),
                Expanded(
                  child: Text('Round ${round.roundNumber}:'),
                  flex: 12,
                ),
                Expanded(
                  child: TextFormField(
                    textAlign: TextAlign.center,
                    decoration: InputDecoration(
                      hintText: '${round.firstNumber}',
                    ),
                  ),
                  flex: 3,
                ),
                Spacer(
                  flex: 1,
                ),
                Expanded(
                  child: TextFormField(
                    textAlign: TextAlign.center,
                    decoration: InputDecoration(
                      hintText: '${round.secondNumber}',
                    ),
                  ),
                  flex: 3,
                ),
              ],
            ),
          )),
        );
      }
    }
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: createLevels(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
    
      void _incrementCounter() {
        setState(() {
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.display1,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }
    

    【讨论】:

    • 谢谢!完美运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2022-12-19
    相关资源
    最近更新 更多