我想在弹出窗口中创建一个带有下图的窗体,如下图所示: 弹出
。
我该如何应对?
答案 0 :(得分:7)
使用rflutter_alert插件 rflutter_alert
您必须将库添加为项目的依赖项。
dependencies:
rflutter_alert: ^1.0.3
要打开一个弹出窗口,让我们成为一个函数并执行以下操作:
_openPopup(context) {
Alert(
context: context,
title: "LOGIN",
content: Column(
children: <Widget>[
TextField(
decoration: InputDecoration(
icon: Icon(Icons.account_circle),
labelText: 'Username',
),
),
TextField(
obscureText: true,
decoration: InputDecoration(
icon: Icon(Icons.lock),
labelText: 'Password',
),
),
],
),
buttons: [
DialogButton(
onPressed: () => Navigator.pop(context),
child: Text(
"LOGIN",
style: TextStyle(color: Colors.white, fontSize: 20),
),
)
]).show();
}
这样称呼
onPressed: () {
_openPopup(context),
}
答案 1 :(得分:1)
您在这里!的ShowDialog需要WidgetBuilder作为参数,从而可以返回任何插件。
import 'package:flutter/material.dart';
void main() {
runApp(new MaterialApp(home: new MyApp()));
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final _formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Flutter"),
),
body: Center(
child: RaisedButton(
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
content: Form(
key: _formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Padding(
padding: EdgeInsets.all(8.0),
child: TextFormField(),
),
Padding(
padding: EdgeInsets.all(8.0),
child: TextFormField(),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: RaisedButton(
child: Text("Submitß"),
onPressed: () {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
}
},
),
)
],
),
),
);
});
},
child: Text("Open Popup"),
),
),
);
}
}
希望对您有帮助!
答案 2 :(得分:1)
这是一个代码示例,它允许您创建一个可以产生这种弹出窗口的按钮。
代码:
RaisedButton(
child: Text("Open Popup"),
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
scrollable: true,
title: Text('Login'),
content: Padding(
padding: const EdgeInsets.all(8.0),
child: Form(
child: Column(
children: <Widget>[
TextFormField(
decoration: InputDecoration(
labelText: 'Name',
icon: Icon(Icons.account_box),
),
),
TextFormField(
decoration: InputDecoration(
labelText: 'Email',
icon: Icon(Icons.email),
),
),
TextFormField(
decoration: InputDecoration(
labelText: 'Message',
icon: Icon(Icons.message ),
),
),
],
),
),
),
actions: [
RaisedButton(
child: Text("Submit"),
onPressed: () {
// your code
})
],
);
});
},
),
输出:
<块引用>要获得更多选项,您必须操作 表单小部件、TextField 小部件或 RaisedButton 小部件,例如 自动验证、装饰、颜色等......如果这还不够,你 可以使用 Dialog 小部件代替 AlertDialog 小部件。但在 在这种情况下,您将用 child 替换 content 属性。和做 必要的修改。
答案 3 :(得分:1)
我尝试了上面的所有答案,但它说没有实质性的 Widget 错误。然后我试试这个 代替图标按钮,您可以使用任何小部件,但您也必须使用脚手架背景颜色作为透明和返回或取消按钮
onTap: () {
showDialog(
context: context,
builder: (BuildContext context) {
return Scaffold(
backgroundColor: Colors.transparent,
body: IconButton(
icon: Icon(Icons.ac_unit),
onPressed: () {
Navigator.pop(context);
},
),
);
},
);
},
答案 4 :(得分:0)
这是一个代码示例,可让您创建一个可以产生这种弹出窗口的按钮。
代码:
RaisedButton(
child: Text("Open Popup"),
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
scrollable: true,
title: Text('Login'),
content: Padding(
padding: const EdgeInsets.all(8.0),
child: Form(
child: Column(
children: <Widget>[
TextFormField(
decoration: InputDecoration(
labelText: 'Name',
icon: Icon(Icons.account_box),
),
),
TextFormField(
decoration: InputDecoration(
labelText: 'Email',
icon: Icon(Icons.email),
),
),
TextFormField(
decoration: InputDecoration(
labelText: 'Message',
icon: Icon(Icons.message ),
),
),
],
),
),
),
actions: [
RaisedButton(
child: Text("Submit"),
onPressed: () {
// your code
})
],
);
});
},
),
输出:
要获得更多选项,您将不得不操纵 表单小部件,TextField小部件或RaisedButton小部件,例如 自动验证,装饰,颜色等...如果这还不够,您 可以使用Dialog小部件而不是AlertDialog小部件。但在 在这种情况下,您将content属性替换为child。和做 必要的修改。
答案 5 :(得分:0)
屏幕截图(不含任何 3rd 方软件包):
代码:只要调用这个方法:
void showDialogWithFields() {
showDialog(
context: context,
builder: (_) {
var emailController = TextEditingController();
var messageController = TextEditingController();
return AlertDialog(
title: Text('Contact Us'),
content: ListView(
shrinkWrap: true,
children: [
TextFormField(
controller: emailController,
decoration: InputDecoration(hintText: 'Email'),
),
TextFormField(
controller: messageController,
decoration: InputDecoration(hintText: 'Message'),
),
],
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: Text('Cancel'),
),
TextButton(
onPressed: () {
// Send them to your email maybe?
var email = emailController.text;
var message = messageController.text;
Navigator.pop(context);
},
child: Text('Send'),
),
],
);
},
);
}