繁体   English   中英

如何在另一个类小部件中获取自定义有状态小部件值?

[英]How to Get Custom Stateful Widget value in another class widget?

在 My Applicatios 的第一个页面中,用户将选择从 1 到 10 的编号,在选择数字后,如果用户选择 5,我的第二个页面将显示 5 GradeScreen 小部件,就像我可以使用下面的代码创建小部件一样,但我无法获得用户从我的 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;
  }
}
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;
  }
}

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

您想在哪里获得下拉值?

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;
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM