点击主窗口+号按钮,打开新窗口,新窗口完全覆盖原主窗口,点击新窗口的对勾号按钮,关闭新窗口返回主窗口,主窗口显示打开窗口编辑框中编辑的数据。
import 'package:flutter/material.dart';
//import 'package:path_provider/path_provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String? edit1Text;
String? edit2Text;
void showDialog() async {
final result = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => DialogPage()),
);
if (result != null) {
setState(() {
edit1Text = result[0];
edit2Text = result[1];
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo Home Page'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
if (edit1Text != null) Text('Edit 1: $edit1Text'),
if (edit2Text != null) Text('Edit 2: $edit2Text'),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: showDialog,
tooltip: 'Open Dialog',
child: Icon(Icons.add),
),
);
}
}
class DialogPage extends StatefulWidget {
@override
_DialogPageState createState() => _DialogPageState();
}
class _DialogPageState extends State<DialogPage> {
TextEditingController controller1 = TextEditingController();
TextEditingController controller2 = TextEditingController();
//Future<List<String>>? _future;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Dialog Page'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
TextField(
controller: controller1,
decoration: InputDecoration(labelText: 'Edit 1'),
),
TextField(
controller: controller2,
decoration: InputDecoration(labelText: 'Edit 2'),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
Navigator.pop(context, [
controller1.text,
controller2.text,
]);
},
tooltip: 'Confirm',
child: Icon(Icons.check),
),
);
}
}
以下是对这段代码的分析:
一、整体结构
这段代码是一个使用 Flutter 框架构建的应用程序。主要包括以下几个部分:
导入必要的包:
import ‘package:flutter/material.dart’;,引入了 Flutter 的基础组件库。
main函数:作为应用程序的入口点,调用runApp函数启动应用,并传入MyApp实例。
MyApp类:
继承自StatelessWidget,用于定义应用的整体结构和主题。
MyHomePage类:继承自StatefulWidget,包含应用的主页面逻辑和状态管理。
_MyHomePageState类:
与MyHomePage相关联的状态类,负责处理主页面的交互和状态更新。
DialogPage类:继承自StatefulWidget,用于显示对话框页面。
_DialogPageState类:
与DialogPage相关联的状态类,负责处理对话框页面的交互。
二、功能描述
应用启动:
在main函数中,调用runApp(MyApp())启动应用,显示MyApp定义的界面。
MyApp类:
build方法返回一个MaterialApp实例,设置了应用的标题为 ‘Flutter Demo’, 主题颜色为蓝色(通过primarySwatch: Colors.blue),并指定了应用的首页为MyHomePage。
MyHomePage类和_MyHomePageState类:
MyHomePage是一个有状态的小部件,它的状态由_MyHomePageState管理。
状态变量:
edit1Text和edit2Text用于存储用户在对话框中输入的文本。
showDialog方法:
使用Navigator.push将用户导航到DialogPage。
当DialogPage返回结果时,如果结果不为空,通过setState更新edit1Text和edit2Text的值。
build方法:
返回一个Scaffold,包含应用栏(AppBar)、页面主体内容(body)和一个悬浮按钮(FloatingActionButton)。
主体内容是一个居中的列(Column),如果edit1Text和edit2Text不为空,则分别显示对应的文本。
悬浮按钮用于触发showDialog方法,打开对话框。
DialogPage类和_DialogPageState类:
DialogPage是一个有状态的小部件,它的状态由_DialogPageState管理。
状态变量:
controller1和controller2是两个TextEditingController,分别用于控制两个TextField的文本输入。
build方法:
返回一个Scaffold,包含应用栏(AppBar)、页面主体内容(body)和一个悬浮按钮(FloatingActionButton)。
主体内容是一个填充了 16 像素边距的列(Column),包含两个TextField, 分别由controller1和controller2控制,并带有相应的标签。
悬浮按钮用于确认输入,点击时将controller1.text和controller2.text作为列表返回,并使用Navigator.pop关闭对话框页面。
三、总结
这段代码实现了一个简单的 Flutter 应用,包含一个主页面和一个对话框页面。用户可以在主页面通过点击悬浮按钮打开对话框,在对话框中输入两个文本,然后点击确认按钮将输入的文本返回到主页面并显示。通过状态管理和页面导航,实现了数据的输入和展示功能。