Невозможно выбрать переключатель в пользовательском интерфейсе, когда groupValue предоставляется с помощью futurebuilder - PullRequest
1 голос
/ 14 февраля 2020

Я пытаюсь использовать флаттер для создания формы с переключателем, и она не работает. Ниже показан минимальный код.

Когда я предоставляю groupValue с помощью FutureBuilder, я не могу выбрать переключатель, отличный от значения по умолчанию, которое уже выбрано. Вероятно, это происходит потому, что setState каждый раз запускает FutureBuilder. Есть ли способ обойти это?

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

const appName = 'Radio Example';

void main() => runApp(MaterialApp(
      title: appName,
      home: MyHomePage(),
    ));

class MyHomePage extends StatefulWidget {
  @override
  MyHomePageState createState() => MyHomePageState();
}

class MyHomePageState extends State<MyHomePage> {
  Future<int> getSelected() async {
    return 1;
  }

  int selectedRadio;

  setSelectedRadio(int val) {
    setState(() {
      selectedRadio = val;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: Text(appName)),
        body: Column(
          children: <Widget>[
            Expanded(
                child: FutureBuilder(
                    future: getSelected(),
                    builder: (context, snapshot) {
                      var newData = snapshot.data;
                      if (newData == null) {
                        return Container(
                          child: Center(
                            child: Text('Loading...'),
                          ),
                        );
                      } else {
                        selectedRadio = newData;
                        return ListView(
                          padding: EdgeInsets.all(24),
                          children: <Widget>[
                            Radio(
                              value: 0,
                              groupValue: selectedRadio,
                              onChanged: (val) {
                                //print("Radio activated");
                                setSelectedRadio(val);
                              },
                            ),
                            Radio(
                              value: 1,
                              groupValue: selectedRadio,
                              onChanged: (val) {
                                //print("Radio activated");
                                setSelectedRadio(val);
                              },
                            ),
                            RaisedButton(
                                child: Text("Save"),
                                onPressed: () {
                                  print("Selected Radio: $selectedRadio");
                                })
                          ],
                        );
                      }
                    })),
          ],
        ));
  }
} 

1 Ответ

0 голосов
/ 14 февраля 2020

Я сталкивался с этой проблемой раньше, хотя я не использовал FutureBuilder, но эта проблема возникла, когда я пытался динамически создавать RadioButton. Наконец-то я придумал эти строки кода:

  List<Widget> createRows() {
   List<Widget> allRows = new List();
   for (int i = 0; i < rawQuestions.length; i++) {
     allRows.add(Directionality(
       textDirection: TextDirection.rtl,
       child: RadioListTile<String>(
         title: Text(
           rawQuestions[i].toString(),
         ),
         activeColor: Colors.teal,
         groupValue: _radioValue,
         value: rawQuestions[i].toString(),
         onChanged: (value) {
           this.setState(() {
             _radioValue = value;
           });
         },
       ),
     ));
   }
   return allRows;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...