Ответ 1
Вы должны обернуть это в диалоге показа действий.
showDialog(context: context, child:
new AlertDialog(
title: new Text("My Super title"),
content: new Text("Hello World"),
)
);
Я пытаюсь создать 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) {},
)
],
);
}
),
);
}
Вы должны обернуть это в диалоге показа действий.
showDialog(context: context, child:
new AlertDialog(
title: new Text("My Super title"),
content: new Text("Hello World"),
)
);
Я заметил, что принятый ответ использует child
для showDialog
который фактически устарел, поэтому я бы рекомендовал избегать его. Вы должны использовать вместо этого builder
, я привел пример:
onPressed: () {
showDialog(
context: context,
builder: (_) => new AlertDialog(
title: new Text("Dialog Title"),
content: new Text("This is my content"),
)
);
}
Существует конкретный сценарий, о котором следует позаботиться, показывая диалог из 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
становится рутом и все работает нормально. В этом случае флаттер автоматически создает локализацию материала, которую в противном случае необходимо создать вручную.
Я не нашел никакой документации по этому же вопросу в официальном документе.
Надеюсь, поможет