【问题标题】:radio button selection is not coming on run time in flutter单选按钮选择不会在颤动的运行时出现
【发布时间】:2020-01-28 15:47:35
【问题描述】:

我正在遍历地图并在底部工作表中创建一个单选按钮,在我的仪表板中,我有“...”按钮,一旦单击它就会打开底部工作表。(在我的仪表板中,我正在调用 DashboardFilter 类存在于filter.dart 文件,带底部表,

下面是filter.dart文件

class DashboardFilter extends StatefulWidget {
  @override
  _DashboardFilterState createState() => _DashboardFilterState();

  final ValueChanged<Map<String, bool>> parentAction;
  final ValueChanged<Map<String, bool>> childAction;

  int radioValue1 = -1;

  DashboardFilter(
      {Key key,
      this.parentAction,
      this.childAction,
    })
      : super(key: key);
}

class _DashboardFilterState extends State<DashboardFilter> {
  void showModalSheet() {

    List<Map<String, Object>> timeData;
    timeData = [
      {"id": 1, "displayId": "Daily"},
      {"id": 2, "displayId": "Weekly"},
      {"id": 3, "displayId": "Monthly"}
    ];

    showModalBottomSheet<void>(
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(10.0),
        ),
        context: context,
        builder: (BuildContext context) {
          return StatefulBuilder(
              builder: (BuildContext context, StateSetter state) {
            return createBox(context, timeData, state);
          });
        });
  }

  createBox(BuildContext context,
      List<Map<String, Object>> tickbox, StateSetter state) {
    DateTime toDate;
    DateTime fromDate;


    var tickboxdata = tickbox.map<Widget>((data) {
      int id = data["id"];
      var dispId = data["displayId"];
      return radiogen(context, id, dispId);
    }).toList();

    return SingleChildScrollView(
      child: LimitedBox(
        child: Column(
          mainAxisSize: MainAxisSize.max,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Container(
              child: Column(
                children: tickboxdata,
              ),),], ), ), );
      }

 void _handleRadioValueChange1(int value) {
    setState(() {
      widget.radioValue1 = value;
      switch (widget.radioValue1) {
        case 1:
          print("1 selected");
          break;
        case 2:
          break;
        case 3:
          break;
      }
    });
  }

  Widget radiogen(BuildContext context, int id, var disp) {
    return Container(
      padding: EdgeInsets.all(8.0),
      child: new Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          new Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              new Radio(
                value: id,
                groupValue: widget.radioValue1,
                onChanged: _handleRadioValueChange1,
              ),
              new Text(
                disp,
                style: new TextStyle(fontSize: 16.0),
              ), ],  ),  ],  ),  );
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: IconButton(
          icon: new Icon(Icons.more_horiz), onPressed: showModalSheet),
    );
  }
}

我面临的问题是,一旦我选择了单选按钮,它没有显示当时选择了哪个项目,我再次需要返回并再次按下 (...) 按钮,然后它显示该选项是已选中。

谁能帮我解决这个问题,

我认为问题出在 setState 上,如果有任何更改要告诉我吗?

【问题讨论】:

    标签: flutter


    【解决方案1】:

    经过一段时间研究您的代码后,这是我的解决方案

    你需要在 radiogen 小部件上放一个 Statesetter

     Widget radiogen(BuildContext context, int id, var disp, StateSetter 
     stateSetter) {
    return Container(
      padding: EdgeInsets.all(8.0),
      child: new Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          new Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              new Radio(
                  value: id,
                  groupValue: widget.radioValue1,
                  onChanged: (value) {
                    stateSetter(() {
                      _handleRadioValueChange1(value);
                    });
                  }),
              new Text(
                disp,
                style: new TextStyle(fontSize: 16.0),
              ),
            ],
          ),
        ],
      ),
    );
    }
    

    然后在调用小部件时传递状态

    createBox(BuildContext context, List<Map<String, Object>> tickbox,
      StateSetter state) {
    DateTime toDate;
    DateTime fromDate;
    
    var tickboxdata = tickbox.map<Widget>((data) {
      int id = data["id"];
      var dispId = data["displayId"];
      return radiogen(context, id, dispId, state);
    }).toList();
    
    return SingleChildScrollView(
      child: LimitedBox(
        child: Column(
          mainAxisSize: MainAxisSize.max,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Container(
              child: Column(
                children: tickboxdata,
              ),
            ),
          ],
        ),
      ),
    );
    }
    

    这样你就可以改变收音机的状态

              Radio(
                  value: id,
                  groupValue: widget.radioValue1,
                  onChanged: (value) {
                    stateSetter(() {
                      _handleRadioValueChange1(value);
                    });
                  }),
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 2019-01-06
      • 2017-07-24
      • 2021-01-21
      • 2019-07-01
      • 2019-12-18
      相关资源
      最近更新 更多