Флаттер отмените выбор кнопок RadioListTile - PullRequest
1 голос
/ 26 февраля 2020

Я пытался выяснить, где моя ошибка, но все еще не мог ее решить. Абсолютный новичок во Флаттере и я строим приложение с несколькими вариантами ответов. У меня есть экран с несколькими вариантами ответов, который импортирует варианты радиолистиля из файла radio_button.dart, показанного ниже.

Все работает, кроме того, что я не могу отменить выбор кнопки, когда она выбрана. Другими словами, если я нажимаю на каждую кнопку, все они выбираются.

 import "package:flutter/material.dart";

 class RB extends StatefulWidget {
 RB({this.choice, this.value});

 final String choice;
 final String value;

@override
_RBState createState() => _RBState();

}
class _RBState extends State<RB> {
bool dense=false;
 String _selection = '';
@override
Widget build(BuildContext context) {
return   Padding(
  padding: const EdgeInsets.all(8.0),
  child: Material(
    elevation: 5.0,
    child: RadioListTile(
      title: Text(widget.choice,  style: TextStyle(color: Colors.blue,),),
      value: widget.choice,
      groupValue: _selection,
      dense: dense,
      activeColor: Colors.green,
      onChanged:( val) { setState(() { _selection = val; print(val);}); },

    ),
  ),
 );
 }
}

Here the question_screen snippet
 Column(
 children: <Widget>[
 Container(child: RB(choice:'A',value:'All of above',)),
 Container(child: RB(choice:'B',value:'None of the above'))

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

поскольку у вас есть значение создания группы для каждого отдельного виджета, вы должны делиться значением группы с каждым фрагментом списка радио, чтобы не создавать его для каждого переключателя. 1- переместите переменную _selection вверх в дереве виджетов для совместного использования для каждого имеющегося у вас RB и передайте его каждому RB . 2 - добавить еще один параметр в класс RB типа Function со строковым параметром и передать его в замененный параметр для каждого RB

вашего RB класс будет выглядеть примерно так:

 class RB extends StatefulWidget {
 RB({this.choice, this.value,this.onchanged});
 final Function (String value) onChanged;
  final String groupValue;
 final String choice;
 final String value;

@override
_RBState createState() => _RBState();

}
class _RBState extends State<RB> {
bool dense=false;
 String _selection = '';
@override
Widget build(BuildContext context) {
return   Padding(
  padding: const EdgeInsets.all(8.0),
  child: Material(
    elevation: 5.0,
    child: RadioListTile(
      title: Text(widget.choice,  style: TextStyle(color: Colors.blue,),),
      value: widget.choice,
      groupValue: widget.groupValue,
      dense: dense,
      activeColor: Colors.green,
      onChanged:widget.onChanged,

    ),
  ),
 );
 }
}

теперь в родительском виджете:

    Column(
     children: <Widget>[
     Container(child: RB(choice:'A',value:'All of 
       above',groupValue:"youValue",onChanged(value){
_selection = value;
setState((){});
})),

Конечно, вы должны разделить замененную функцию на вспомогательную функцию для поиска удобочитаемости и гибкости. ,

1 голос
/ 26 февраля 2020

Оберните RadioListTile GestureDetector

          GestureDetector(
            onTap: () {
              setState(() {
                _selection = '';
              });
            },
            child: RadioListTile(
            //...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...