如何在颤动中获得这种单选按钮

Posted

技术标签:

【中文标题】如何在颤动中获得这种单选按钮【英文标题】:How to get this kind of radio button in flutter 【发布时间】:2019-07-05 18:21:44 【问题描述】:

我正在尝试创建一个包含 3 个单选按钮的性别选择功能。我已经完成了这段代码,但它没有按我想要的那样工作。

单选按钮容器

final _radio_colume_container = Container(
margin: const EdgeInsets.fromLTRB(50, 15, 50, 00),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
  Text(
    'Gender*',
  ),
  Row(
    mainAxisAlignment: MainAxisAlignment.start,
    children: <Widget>[
      add_radio_button(0, 'Male'),
      add_radio_button(1, 'Female'),
      add_radio_button(2, 'Others'),
    ],
  ),
],
),
);

add_radio_button 方法

Row add_radio_button(int btnValue, String title) 
return Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[

  Radio(
    activeColor: Colors.green,
    value: btnValue,
    groupValue: -1,
    onChanged: _handleradiobutton,
  ),
  Text(title)
],
);

我正在实现这一目标

我想实现这个。

【问题讨论】:

我看不出有什么区别,是不是两个图像中的 padding 不同?? 你的目标是改变颜色吗? @ChennaReddy 填充也不正确,单选按钮和标题之间的空间也更大,我想减少它。 @MazinIbrahim 是的,但我稍后会处理,首先我需要获得相同的布局。 Radio 拥有 - materialTapTargetSize: 属性 - 实现 - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, 【参考方案1】:

在对@Shubham 的回答进行了一些重构之后,呈现了用于多种用途的通用代码版本。

import 'package:flutter/material.dart';

/// Requires a list of string ['Male','Female','Other'] only once.

class GenderField extends StatelessWidget 
 
 final List<String> genderList;

  GenderField(this.genderList);

  @override
  Widget build(BuildContext context) 
    String select;
    Map<int, String> mappedGender = genderList.asMap();

    return StatefulBuilder(
      builder: (_, StateSetter setState) => Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        mainAxisSize: MainAxisSize.min,
        children: [
          Text(
            'Gender : ',
            style: TextStyle(fontWeight: FontWeight.w400),
          ),
          ...mappedGender.entries.map(
            (MapEntry<int, String> mapEntry) => Row(
                mainAxisAlignment: MainAxisAlignment.start,
                mainAxisSize: MainAxisSize.min,
                children: [
                  Radio(
                    activeColor: Theme.of(context).primaryColor,
                    groupValue: select,
                    value: genderList[mapEntry.key],
                    onChanged: (value) => setState(() => select = value),
                  ),
                  Text(mapEntry.value)
                ]),
          ),
        ],
      ),
    );
  

在main.dart中,这个小部件可以被称为

// Some code 
  Padding(
            padding: EdgeInsets.only(bottom: 10),
            child: GenderField(['Male','Female','Other'])
)

【讨论】:

【参考方案2】:
  List gender=["Male","Female","Other"];

  String select;

 Row addRadioButton(int btnValue, String title) 
    return Row(
  mainAxisAlignment: MainAxisAlignment.start,
  children: <Widget>[
    Radio(
      activeColor: Theme.of(context).primaryColor,
      value: gender[btnValue],
      groupValue: select,
      onChanged: (value)
        setState(() 
          print(value);
          select=value;
        );
      ,
    ),
    Text(title)
  ],
);
 
            //Use the above widget where you want the radio button
                child: Row(
                children: <Widget>[
                  addRadioButton(0, 'Male'),
                  addRadioButton(1, 'Female'),
                  addRadioButton(2, 'Others'),
                ],
              ),

【讨论】:

虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。【参考方案3】:

您应该看看RadioListTile,因为它提供了一个dense 属性,这将有助于减少按钮与其标题之间的填充。

【讨论】:

是的,首先我会尝试你的解决方案,如果可行,我会接受它。

以上是关于如何在颤动中获得这种单选按钮的主要内容,如果未能解决你的问题,请参考以下文章

当用户从颤动的单选按钮组中选择单选按钮时如何保存数据?

颤动 - 如何在颤动中保存状态选择的单选按钮列表?

如何在颤动中使用listview builder制作动态单选按钮?

颤动验证单选按钮

颤动:自定义单选按钮

颤动中的单选按钮活动颜色不起作用