Подтвердить что ты не робот

Flutter - SimpleDialog в FloatingActionButton

Я пытаюсь создать SimpleDialog после нажатия на FloatingActionButton, однако при нажатии этой кнопки ничего не происходит.

Что я делал неправильно?

import "package:flutter/material.dart";

void main() {
  runApp(new ControlleApp());
}

class ControlleApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) => new Scaffold(
    appBar: new AppBar(
      backgroundColor: new Color(0xFF26C6DA),
    ),
    floatingActionButton: new FloatingActionButton(
      tooltip: 'Add',
      child: new Icon(Icons.add),
      backgroundColor: new Color(0xFFF44336),
      onPressed: (){
        new SimpleDialog(
          title: new Text('Test'),
          children: <Widget>[
            new RadioListTile(
              title: new Text('Testing'), value: null, groupValue: null, onChanged: (value) {},
            )
          ],
        );
      }     
    ),    
  );
}
4b9b3361

Ответ 1

Вы должны обернуть это в диалоге показа действий.

showDialog(context: context, child:
    new AlertDialog(
      title: new Text("My Super title"),
      content: new Text("Hello World"),
    )
);

Ответ 2

Я заметил, что принятый ответ использует child для showDialog который фактически устарел, поэтому я бы рекомендовал избегать его. Вы должны использовать вместо этого builder, я привел пример:

onPressed: () {
    showDialog(
        context: context,
        builder: (_) => new AlertDialog(
            title: new Text("Dialog Title"),
            content: new Text("This is my content"),
        )
    );
}

Ответ 3

Существует конкретный сценарий, о котором следует позаботиться, показывая диалог из floatingActionButton

если вы напишите свой код, как это

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        floatingActionButton: FloatingActionButton(
            onPressed: () {
              showDialog(
                  context: context,
                  builder: (ctxt) => new AlertDialog(
                    title: Text("Text Dialog"),
                  )
              );
            }),
      )
    );
  }
}

Он не отображает диалог оповещения, но выдает исключение "Локализация материалов не найдена".

Это происходит, когда MaterialApp не является корнем, где вызывается диалог. В этом случае корневым виджетом является Приложение. Однако, если мы изменим код как

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyAppImpl()
    );
  }
}

class MyAppImpl extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
          onPressed: () {
            showDialog(
                context: context,
                builder: (ctxt) => new AlertDialog(
                  title: Text("Text Dialog"),
                )
            );
          }),
    );
  }
}

MaterialApp становится рутом и все работает нормально. В этом случае флаттер автоматически создает локализацию материала, которую в противном случае необходимо создать вручную.

Я не нашел никакой документации по этому же вопросу в официальном документе.

Надеюсь, поможет