一尘不染

Flutter-为什么滑块在AlertDialog中不更新?

flutter

我正在执行AlertDialog,所以当我尝试将Slider小部件插入值状态时,听起来真的很陌生,如果Slider在AlertDialog之外,则不会发生这种情况

new Slider(
  onChanged: (double value) {
    setState(() {
      sliderValue = value;
    });
  },
  label: 'Oi',
  divisions: 10,
  min: 0.0,
  max: 10.0,
  value: sliderValue,
)

AlertDialog的完整小部件代码

Future<Null> _showDialog() async {
  await showDialog<Null>(
      context: context,
      builder: (BuildContext context) {
        return new AlertDialog(
          title: const Text('Criar novo cartão'),
          actions: <Widget>[
            new FlatButton(onPressed: () {
              Navigator.of(context).pop(null);
            }, child: new Text('Hello'))
          ],
          content: new Container(
            child: new Column(
              mainAxisAlignment: MainAxisAlignment.start,
              mainAxisSize: MainAxisSize.min,
              children: <Widget>[
                new Text('Deseja iniciar um novo cartão com quantos pedidos ja marcados?'),
                new Slider(
              onChanged: (double value) {
                setState(() {
                  sliderValue = value;
                });
              },
              label: 'Oi',
              divisions: 10,
              min: 0.0,
              max: 10.0,
              value: sliderValue,
            )
              ],
            ),
          ),
        );
      }
  );
}

一切都在StatefullWidget的State类下。

它看起来像不会更新值,并且在尝试更改值时保持不变。

更新1

问题是Slider中有2个必需的参数(onChanged, value),所以我应该更新此参数或UI保持一致,请观看视频如何运行应用程序

YouTube上的视频

更新2

我还在Github存储库中打开了一个问题以获得相关帮助,如果有人想获取更多信息,请参见问题#19323


阅读 289

收藏
2020-08-13

共1个答案

一尘不染

问题在于,掌握状态的不是您的对话框。是名为的小部件showDialog。也是一样,当你打电话的setState,你是在对话框的创造者打来的。

问题是,对话框 不是build方法内部构建的。它们在不同的小部件树上。因此,当对话框创建者更新时,对话框不会。

相反,您应该使对话框保持状态。将数据保存在该对话框中。然后用于Navigator.pop(context, sliderValue)将滑块值发送回对话框创建器。

对话框中的等效项是

FlatButton(
  onPressed: () => Navigator.of(context).pop(sliderValue),
  child: Text("Hello"),
)

然后您可以了解showDialog结果:

final sliderValue = await showDialog<double>(
  context: context,
  builder: (context) => MyDialog(),
)
2020-08-13