如何解决当按钮位于父项中时,如何从子项到父项获得价值?
我一直在颤抖地使用Stepper视图。由于按钮位于父窗口小部件中,因此在单击按钮时从子对象向父对象获取价值时遇到了问题。
这是我的父母班和我的孩子班。
家长班 这是我的父类,具有“步进”视图以及“下一步”和“后退”按钮。单击“ Next”按钮时,我想从子类到父类获取价值。
Type Error on line 130: Class constructor SecondClock cannot be invoked without 'new'
儿童班 这是我的子类,我有一个Listview,它的作用类似于单选按钮。单击按钮时,我希望选定的项及其对父类的值。
new Class(<constructor arguments>)
解决方法
您可以在下面复制粘贴运行完整代码
您可以使用GlobalKey
获取deliveryState
中的Delivery
,然后使用deliveryState
获取Delivery
的属性,此处的属性为RadioModel selected
步骤1:使用GlobalKey _key = GlobalKey();
class _MyHomePageState extends State<DeliveryTimeline> {
...
GlobalKey _key = GlobalKey();
第2步:使用deliveryState
获得seleted
项
onStepContinue: () {
setState(() {
if (this._currentStep == 0) {
this._currentStep = this._currentStep + 1;
final _DeliveryState deliveryState =
_key.currentState;
print("hi ${deliveryState.selected.title} ${deliveryState.selected.label} ");
第3步:Delivery
需要key
child: Delivery(
key: _key,onShipingTypeClicked: (shippingtype) {
...
Delivery({Key key,this.onShipingTypeClicked}) : super(key:key);
第4步:设置变量selected
RadioModel selected = null;
...
return InkWell(
onTap: () {
setState(() {
...
selected = sampleData[index];
工作演示
工作演示的输出
I/flutter ( 6246): hi Standard Delivery Order will be delivered between 3 - 5 business days
完整代码
import 'package:flutter/material.dart';
class DeliveryTimeline extends StatefulWidget {
DeliveryTimeline({Key key,this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<DeliveryTimeline> {
int _currentStep = 0;
String shippingtype;
GlobalKey _key = GlobalKey();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.white,centerTitle: true,iconTheme: IconThemeData(color: Colors.black),elevation: 0,title: Text(
"Checkout",style: TextStyle(color: Colors.black),),body: Stepper(
type: StepperType.horizontal,steps: _mySteps(),currentStep: this._currentStep,onStepTapped: (step) {
setState(() {
this._currentStep = step;
});
},onStepContinue: () {
setState(() {
if (this._currentStep == 0) {
this._currentStep = this._currentStep + 1;
final _DeliveryState deliveryState =
_key.currentState;
print("hi ${deliveryState.selected.title} ${deliveryState.selected.label} ");
} else if (this._currentStep == 1) {
this._currentStep = this._currentStep + 1;
} else {
print('Completed,check fields.');
}
});
},onStepCancel: () {
setState(() {
if (this._currentStep > 0) {
this._currentStep = this._currentStep - 1;
} else {
this._currentStep = 0;
}
});
},controlsBuilder: (BuildContext context,{VoidCallback onStepContinue,VoidCallback onStepCancel,Function onShippingNextClick}) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,children: <Widget>[
OutlineButton(
child: Text("Back"),onPressed: onStepCancel,shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(4.0))),MaterialButton(
child: Text("Next"),color: Colors.blue,textColor: Colors.white,onPressed: onStepContinue,],);
}));
}
List<Step> _mySteps() {
List<Step> _steps = [
Step(
title: Text('Delivery'),content: Center(
child: Container(
height: MediaQuery.of(context).size.height / 1.5,child: Delivery(
key: _key,onShipingTypeClicked: (shippingtype) {
shippingtype = shippingtype;
print("myvalue${shippingtype}");
},isActive: _currentStep >= 0,Step(
title: Text('Address'),content: Text("Address()"),isActive: _currentStep >= 1,Step(
title: Text('Payment'),content: Text("Payment()"),isActive: _currentStep >= 2,)
];
return _steps;
}
}
class Delivery extends StatefulWidget {
final ValueChanged<String> onShipingTypeClicked;
Delivery({Key key,this.onShipingTypeClicked}) : super(key:key);
@override
_DeliveryState createState() => _DeliveryState();
}
class _DeliveryState extends State<Delivery> {
List<RadioModel> sampleData = List<RadioModel>();
@override
void initState() {
// TODO: implement initState
super.initState();
sampleData.add(RadioModel(false,'A',0xffe6194B,"Standard Delivery","Order will be delivered between 3 - 5 business days",1));
sampleData.add(RadioModel(
true,"Next Day Delivery","Place your order before 6pm and your items will be delivered the next day",2));
sampleData.add(RadioModel(
false,"Nominated Delivery","Pick a particular date from the calendar and order will be delivered on selected date",3));
}
RadioModel selected = null;
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
itemCount: sampleData.length,shrinkWrap: true,physics: NeverScrollableScrollPhysics(),itemBuilder: (BuildContext context,int index) {
return InkWell(
onTap: () {
setState(() {
sampleData.forEach((element) => element.isSelected = false);
sampleData[index].isSelected = true;
selected = sampleData[index];
widget.onShipingTypeClicked(sampleData[index].buttonText);
});
},child: Column(
crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[
ListTile(
title: Text(sampleData[index].title),Padding(
padding: const EdgeInsets.only(bottom: 20.0),child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,children: <Widget>[
Flexible(
child: Text(sampleData[index].label),RadioItem(sampleData[index]),)
],));
},);
}
}
class RadioItem extends StatelessWidget {
final RadioModel _item;
RadioItem(this._item);
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.all(15.0),child: Row(
mainAxisSize: MainAxisSize.max,children: <Widget>[
Container(
height: 25.0,width: 25.0,alignment: Alignment.center,child: Container(
height: 15.0,width: 15.0,decoration: BoxDecoration(
color: Colors.blue,borderRadius:
const BorderRadius.all(const Radius.circular(15)),)),decoration: BoxDecoration(
color: Colors.transparent,border: Border.all(
width: 3.0,color: _item.isSelected ? Colors.blue : Colors.transparent),borderRadius: const BorderRadius.all(const Radius.circular(25)),Container(margin: EdgeInsets.only(left: 10.0))
],);
}
}
class RadioModel {
bool isSelected;
final String buttonText;
final int colorCode;
final String title,label;
final int buttonid;
RadioModel(this.isSelected,this.buttonText,this.colorCode,this.title,this.label,this.buttonid);
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',theme: ThemeData(
primarySwatch: Colors.blue,visualDensity: VisualDensity.adaptivePlatformDensity,home: DeliveryTimeline(),);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。