如何解决Flutter Navigator将类作为参数传递,不能获取参数属性,但是可以获取方法?
如何使用Flutter Navigator将类作为具有所有属性和方法的参数传递?在下面的代码中,我传递了一个具有四个属性和两个方法的类实例“ dataClass”,如下所示。
bool _bGender;
int _bWeight;
double _bHeight;
int _bAge;
double getBMI();
String getDiagnose();
在第二个屏幕“ resultpage.dart”中,我能够接收到参数(dataClass),但是没有找到属性,只有方法。不知道为什么吗?
args._bAge (Not found)
args._bWeight (Not found)
args._bHeight (Not found)
args._bGender (Not found)
args.getBMI() Ok!
args.getDiagnose() Ok!
BTW,这是一个功能齐全的Flutter应用,BMI计算器没有错误
文件名:main.dart
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'resultpage.dart';
import 'package:flutter/services.dart';
void main() => runApp(MyApp());
// Data class used to pass args to result page
class BMIdata {
bool _bGender;
int _bWeight;
double _bHeight;
int _bAge;
BMIdata(this._bGender,this._bWeight,this._bHeight,this._bAge);
double getBMI() {
return this._bWeight / (this._bHeight/100 * 2);
}
String getDiagnose(double bmi) {
String _diagnose;
//Body Mass Index (BMI)
//Source: https://www.cdc.gov/obesity/adult/defining.html
//Source 2: https://depart.femh.org.tw/dietary/3OPD/BMI.htm
if (bmi < 18.5) {
_diagnose = 'Underweight';
} else if (bmi > 18.5 && bmi < 24.0) {
_diagnose = 'Healthy!';
} else if (bmi > 24.0 && bmi < 27.0) {
_diagnose = 'Overweight';
} else if (bmi > 27.0 && bmi < 30.0) {
_diagnose = 'Slightly Obese';
} else if (bmi > 30.0 && bmi < 35.0) {
_diagnose = 'Obesity';
} else if (bmi > 35.0) {
_diagnose = 'Server Obesity';
}
return _diagnose;
}
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,]);
return MaterialApp(
debugShowCheckedModeBanner: false,title: 'Flutter BMI Calculator',theme: ThemeData(
// primaryColor: Colors.black87,),home: Calculator(),routes: {
'/resultPage': (context) => ResultPage(),},);
}
}
class Calculator extends StatefulWidget {
@override
_CalculatorState createState() => _CalculatorState();
}
class _CalculatorState extends State<Calculator> {
var dataClass = BMIdata(false,55,160,25); //initial value
@override
Widget build(BuildContext context) {
double _screenWidth = MediaQuery.of(context).size.width;
double _screenHeight = MediaQuery.of(context).size.height;
return SafeArea(
child: Scaffold(
backgroundColor: Colors.black87,appBar: AppBar(
backgroundColor: Colors.grey.shade900,title: Center(
child: Text('BMI Calculator'),body: Column(
children: <Widget>[
Expanded(
child: Container(
child: Row(
children: <Widget>[
Expanded(
child: Container(
margin: EdgeInsets.all(10.0),decoration: BoxDecoration(
color: Colors.grey.shade900,borderRadius: BorderRadius.circular(15),child: Padding(
padding: const EdgeInsets.all(10.0),child: FlatButton(
onPressed: () {
dataClass._bGender = true;
print(dataClass._bGender);
setState(() {});
},child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[
Container(
child: Icon(
FontAwesomeIcons.venus,color: dataClass._bGender
? Colors.white
: Colors.grey.shade800,size: 80,Container(
child: Text(
'FEMALE',style: TextStyle(
color: dataClass._bGender
? Colors.white
: Colors.grey.shade800,fontSize: 20),],Expanded(
child: Container(
margin: EdgeInsets.all(10.0),child: FlatButton(
onPressed: () {
dataClass._bGender = false;
print(dataClass._bGender);
setState(() {});
},children: <Widget>[
Container(
child: Icon(
FontAwesomeIcons.mars,color: dataClass._bGender
? Colors.grey.shade700
: Colors.white,Container(
child: Text(
'MALE',style: TextStyle(
color: dataClass._bGender
? Colors.grey.shade700
: Colors.white,Container(
margin: EdgeInsets.all(10.0),decoration: BoxDecoration(
color: Colors.grey.shade900,child: Column(
children: <Widget>[
Container(
child: Text(
'Height',style: TextStyle(fontSize: 20,color: Colors.white),Container(
child: Text(
dataClass._bHeight.toString() + ' cm',style: TextStyle(fontSize: 40,Container(
child: Slider(
min: 60,max: 240,value: dataClass._bHeight,divisions: 240 - 60,label: dataClass._bHeight.round().toString(),activeColor: Colors.red,inactiveColor: Colors.white24,onChanged: ((double value) {
setState(() {
dataClass._bHeight = value;
print(value);
});
}),Row(
children: <Widget>[
Expanded(
child: Container(
margin: EdgeInsets.all(10.0),decoration: BoxDecoration(
color: Colors.grey.shade900,child: Padding(
padding: const EdgeInsets.all(10.0),child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[
Container(
child: Text(
'Weight',style:
TextStyle(color: Colors.white,Container(
child: Text(
dataClass._bWeight.toString(),fontSize: 60),Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[
Container(
width: 50.0,height: 50.0,decoration: BoxDecoration(
color: Colors.red,borderRadius: BorderRadius.circular(50),child: FlatButton(
onPressed: () {
setState(() {
dataClass._bWeight -= 1;
});
},child: Icon(
FontAwesomeIcons.minus,color: Colors.white,)),Container(
width: 50.0,child: FlatButton(
onPressed: () {
setState(() {
dataClass._bWeight += 1;
});
},child: Icon(
FontAwesomeIcons.plus,Expanded(
child: Container(
margin: EdgeInsets.all(10.0),children: <Widget>[
Container(
child: Text(
'Age',Container(
child: Text(
dataClass._bAge.toString(),child: FlatButton(
onPressed: () {
setState(() {
dataClass._bAge -= 1;
});
},onLongPress: (){
setState(() {
dataClass._bAge -= 10;
});
},child: FlatButton(
onPressed: () {
setState(() {
dataClass._bAge += 1;
});
},onLongPress: (){
setState(() {
dataClass._bAge += 10;
});
},Container(
width: _screenWidth * .9,height: _screenHeight * .1,child: FlatButton(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15.0),color: Colors.red,child: Text(
'Calculate BMI',style: TextStyle(color: Colors.white,fontSize: 24),onPressed: () {
Navigator.pushNamed(
context,ResultPage.routeName,arguments: dataClass,);
},);
}
}
文件名:resultPage.dart
import 'package:bmiflutterapp/main.dart';
import 'package:flutter/material.dart';
class ResultPage extends StatefulWidget {
static const routeName = '/resultPage';
@override
_ResultPageState createState() => _ResultPageState();
}
class _ResultPageState extends State<ResultPage> {
@override
Widget build(BuildContext context) {
final BMIdata args = ModalRoute.of(context).settings.arguments;
print(args.getDiagnose(args.getBMI()));
return SafeArea(
child: Scaffold(
backgroundColor: Colors.black87,appBar: AppBar(
title: Text('BMI Calculating Result:'),body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: <Widget>[
Text(
"Your BMI is " +
"${args.getBMI().toStringAsFixed(2)}",style: TextStyle(
color: Colors.white,fontSize: 30,Text(
"Diagnosis is "+
"${args.getDiagnose(args.getBMI())}",);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。