【问题标题】:How to Get Custom Stateful Widget value in another class widget?如何在另一个类小部件中获取自定义有状态小部件值?
【发布时间】:2019-03-01 17:29:34
【问题描述】:

在我的应用程序的第一个页面中,用户将选择从 1 到 10 的编号,在选择数字后,如果用户选择 5,我的第二个页面将显示 5 GradeScreen 小部件,同样我可以使用以下代码创建小部件,但我可以' t 获取用户从我的 GradeScreen 小部件中的下拉按钮小部件中选择的值,

请帮助我从这个 GradeScreen 小部件中获得价值。 我是 Flutter 的新手。 提前致谢。

import 'package:flutter/material.dart';

class CalculateCGPAScreen extends StatelessWidget {
  final int noOfSubjectsCount;

  CalculateCGPAScreen(this.noOfSubjectsCount);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(),
      body: Column(
        children: noOfSubjects(noOfSubjectsCount),
      ),
    );
  }

  List<Widget> noOfSubjects(int subjectCount) {
    List<Widget> list = [];
    for (int i = 1; i <= subjectCount; i++) {
      list.add(GradeScreen("Subject $i", 1));
    }
    list.add(RaisedButton(
      onPressed: () {},
      color: Colors.amber,
      splashColor: Colors.amberAccent,
      child: Text("Calculate CGPA"),
    ));
    return list;
  }
}

class GradeScreen extends StatefulWidget {
  final String subjectName;
  final int gradeSystem;

  GradeScreen(this.subjectName, this.gradeSystem);

  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _GradeScreenState();
  }
}

class _GradeScreenState extends State<GradeScreen> {
  String selectedGrade = "S";
  List<int> creditList = [1, 2, 3, 4, 5, 6];
  int selectedCredit = 1;

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: <Widget>[
        Text(widget.subjectName),
        DropdownButton(
          items: getGradeList(widget.gradeSystem).map((String loopValue) {
            return DropdownMenuItem(
              child: Text(loopValue),
              value: loopValue,
            );
          }).toList(),
          onChanged: (String value) {
            setState(() {
              selectedGrade = value;
            });
          },
          value: selectedGrade,
        ),
        DropdownButton(
          items: creditList.map((int credit) {
            return DropdownMenuItem(
              child: Text(credit.toString()),
              value: credit,
            );
          }).toList(),
          onChanged: (int value) {
            setState(() {
              selectedCredit = value;
            });
          },
          value: selectedCredit,
        )
      ],
    );
  }

  List<String> getGradeList(int option) {
    List<String> gradeSystem;
    if (option == 1) {
      gradeSystem = ['S', 'A', 'B', 'C', 'D', 'E'];
    } else {
      gradeSystem = ['O', 'A+', 'A', 'B+', 'B'];
    }
    return gradeSystem;
  }
}

【问题讨论】:

    标签: dart flutter


    【解决方案1】:
    import 'package:flutter/material.dart';
    
    class CalculateCGPAScreen extends StatelessWidget {
      final int noOfSubjectsCount;
    
      CalculateCGPAScreen(this.noOfSubjectsCount);
    
      @override
      Widget build(BuildContext context) {
        // TODO: implement build
        return Scaffold(
          appBar: AppBar(),
          body: Column(
            children: noOfSubjects(noOfSubjectsCount),
          ),
        );
      }
    
      List<Widget> noOfSubjects(int subjectCount) {
        List<Widget> list = [];
        for (int i = 1; i <= subjectCount; i++) {
          list.add(GradeScreen("Subject $i", 1));
        }
        list.add(RaisedButton(
          onPressed: () {
            for (var item in list) {
              if (item is GradeScreen) {
                GradeScreen gs = item;
                print(gs.grade);
                print(gs.credit);
              }
            }
          },
          color: Colors.amber,
          splashColor: Colors.amberAccent,
          child: Text("Calculate CGPA"),
        ));
        return list;
      }
    }
    
    class GradeScreen extends StatefulWidget {
      final String subjectName;
      final int gradeSystem;
      int _credit;
      String _grade;
      GradeScreen(this.subjectName, this.gradeSystem);
    
      @override
      State<StatefulWidget> createState() {
        // TODO: implement createState
        return _GradeScreenState();
      }
    
      set credit(int value) {
        _credit = value;
      }
    
      get credit => _credit;
    
      set grade(String value) {
        _grade = value;
      }
    
      get grade => _grade;
    }
    
    class _GradeScreenState extends State<GradeScreen> {
      String selectedGrade = "S";
      List<int> creditList = [1, 2, 3, 4, 5, 6];
      int selectedCredit = 1;
    
      @override
      Widget build(BuildContext context) {
        // TODO: implement build
        return Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            Text(widget.subjectName),
            DropdownButton(
              items: getGradeList(widget.gradeSystem).map((String loopValue) {
                return DropdownMenuItem(
                  child: Text(loopValue),
                  value: loopValue,
                );
              }).toList(),
              onChanged: (String value) {
                setState(() {
                  selectedGrade = value;
                  widget.grade = value;
                });
              },
              value: selectedGrade,
            ),
            DropdownButton(
              items: creditList.map((int credit) {
                return DropdownMenuItem(
                  child: Text(credit.toString()),
                  value: credit,
                );
              }).toList(),
              onChanged: (int value) {
                setState(() {
                  selectedCredit = value;
                  widget.credit = value;
                });
              },
              value: selectedCredit,
            )
          ],
        );
      }
    
      List<String> getGradeList(int option) {
        List<String> gradeSystem;
        if (option == 1) {
          gradeSystem = ['S', 'A', 'B', 'C', 'D', 'E'];
        } else {
          gradeSystem = ['O', 'A+', 'A', 'B+', 'B'];
        }
        return gradeSystem;
      }
    }
    

    更改下拉值并将结果输入调试控制台。

    【讨论】:

    • 对我有用,兄弟。非常感谢。我现在真的很开心。
    【解决方案2】:
    import 'package:flutter/material.dart';
    
    class CalculateCGPAScreen extends StatelessWidget {
      final int noOfSubjectsCount;
    
      CalculateCGPAScreen(this.noOfSubjectsCount);
    
      @override
      Widget build(BuildContext context) {
        // TODO: implement build
        return Scaffold(
          appBar: AppBar(),
          body: Column(
            children: noOfSubjects(noOfSubjectsCount),
          ),
        );
      }
    
      List<Widget> noOfSubjects(int subjectCount) {
        List<Widget> list = [];
        for (int i = 1; i <= subjectCount; i++) {
          list.add(GradeScreen("Subject $i", 1));
        }
        list.add(RaisedButton(
          onPressed: () {},
          color: Colors.amber,
          splashColor: Colors.amberAccent,
          child: Text("Calculate CGPA"),
        ));
        return list;
      }
    }
    
    class GradeScreen extends StatefulWidget {
      final String subjectName;
      final int gradeSystem;
      int _data;
      GradeScreen(this.subjectName, this.gradeSystem);
    
      @override
      State<StatefulWidget> createState() {
        // TODO: implement createState
        return _GradeScreenState();
      }
    
      set data(int value) {
        _data = value;
      }
    
      get data => _data;
    }
    
    class _GradeScreenState extends State<GradeScreen> {
      String selectedGrade = "S";
      List<int> creditList = [1, 2, 3, 4, 5, 6];
      int selectedCredit = 1;
    
      @override
      Widget build(BuildContext context) {
        // TODO: implement build
        return Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            Text(widget.subjectName),
            DropdownButton(
              items: getGradeList(widget.gradeSystem).map((String loopValue) {
                return DropdownMenuItem(
                  child: Text(loopValue),
                  value: loopValue,
                );
              }).toList(),
              onChanged: (String value) {
                setState(() {
                  selectedGrade = value;
                });
              },
              value: selectedGrade,
            ),
            DropdownButton(
              items: creditList.map((int credit) {
                return DropdownMenuItem(
                  child: Text(credit.toString()),
                  value: credit,
                );
              }).toList(),
              onChanged: (int value) {
                setState(() {
                  selectedCredit = value;
                  widget.data = selectedCredit;
                });
              },
              value: selectedCredit,
            )
          ],
        );
      }
    
      List<String> getGradeList(int option) {
        List<String> gradeSystem;
        if (option == 1) {
          gradeSystem = ['S', 'A', 'B', 'C', 'D', 'E'];
        } else {
          gradeSystem = ['O', 'A+', 'A', 'B+', 'B'];
        }
        return gradeSystem;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 1970-01-01
      • 2021-12-26
      • 2020-07-31
      • 2020-09-10
      • 2021-08-27
      • 1970-01-01
      • 2018-12-04
      • 2019-12-17
      相关资源
      最近更新 更多