当按钮位于父项中时,如何从子项到父项获得价值?

问题描述

我一直在颤抖地使用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];  

工作演示

enter image description here

工作演示的输出

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(),);
  }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...