0

当我按下 Radio 时,我想执行一些代码。GestureDetector 在任何地方都有效,但不是在这里。如果你运行下面的代码,你会在点击 Text 时得到响应(打印),但在点击 Radio 时不会(两者都包含在同一个 GestureDetector 中)。

您有什么建议,如何克服这个问题(或解释为什么会发生这种情况)?

class _MyHomePageState extends State<MyHomePage> {
  int radioGroupValue = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: Center(
          child: GestureDetector(
              onTap: () => print("GestureDetector has been tapped."),
              child: new Row(children: [
                new Radio(
                  value: 0,
                  groupValue: radioGroupValue,
                  onChanged: _handleRadioValueWkotType,
                ),
                new Text("label 1"),
                new Radio(
                  value: 1,
                  groupValue: radioGroupValue,
                  onChanged: _handleRadioValueWkotType,
                ),
                new Text("label 2"),
              ])),
        ));
  }

  void _handleRadioValueWkotType(int value) {
    setState(() {
      radioGroupValue = value;
    });
  }
}
4

2 回答 2

5

您可以使用RadioListTile与小部件相同的radio小部件,但它具有额外的title参数,您可以在其中提供text将显示在radio小部件旁边的参数,并且单击标题文本的行为与单击单选小部件本身的行为相同。

RadioListTile(
              title: Text('Standard'),
              value: 1,
              groupValue: _selectedType,
              onChanged: (int value) {
                Select(value);
}),

查看官方链接和示例

于 2019-02-04T12:42:53.020 回答
0

单选按钮已经是一个可点击的元素,因此您无需将其包装在 GestureDetector 中。在 GestureDetector 中包装跟随它的文本是有意义的,但不是按钮本身。实现您想要的一种方法是通常调用一些方法 onTap,但也可以在值更改时调用,它在 Radios 上使用的 onChanged 方法本身内部,如下所示:

class _MyHomePageState extends State<HomePage> {
  int radioGroupValue = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: Center(
          child: GestureDetector(
              onTap: () => eitherRadioTapped(),
              child: new Row(children: [
                new Radio(
                  value: 0,
                  groupValue: radioGroupValue,
                  onChanged: _handleRadioValueWkotType,
                ),
                new Text("label 1"),
                new Radio(
                  value: 1,
                  groupValue: radioGroupValue,
                  onChanged: _handleRadioValueWkotType,
                ),
                new Text("label 2"),
              ])),
        ));
  }

  void eitherRadioTapped(){
    print("Anything in the row has been tapped.");
  }

  bool _handleRadioValueWkotType(int value) {
    print("Radio has been tapped.");

    //Whatever happendeed, it was clicked, so call the extra method
    eitherRadioTapped(); 

    setState(() {
      radioGroupValue = value;
    });
    return false;
  }

您甚至可以onChanged在您自己的代码上将 Radio 的方法设置为 null,这会使 GestureDetector 接收事件,但这会使 Radio 变灰并需要其他解决方法,为每个 Radio 元素设置单独的 GestureDetectors,这并不理想并且是不那么简单。

于 2019-02-03T18:37:12.047 回答