Flutter 如何在Flatter中将搜索栏中的值传递到上一个屏幕
我有一个屏幕,其中有一个Flutter 如何在Flatter中将搜索栏中的值传递到上一个屏幕,flutter,dart,Flutter,Dart,我有一个屏幕,其中有一个TextFormField。当我点击这个TextFormField时,我打开了一个带有项目的搜索栏。 是否可以通过某种方式将从搜索栏中选择的值传递到上一屏幕? 如果可能,我希望单击某个项目关闭搜索栏,并在上一个屏幕上显示该项目的名称(在MyHomePage)。 这是我的进度,但我不知道如何向后传递值: import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyA
TextFormField
。当我点击这个TextFormField
时,我打开了一个带有项目的搜索栏。
是否可以通过某种方式将从搜索栏中选择的值传递到上一屏幕?
如果可能,我希望单击某个项目关闭搜索栏,并在上一个屏幕上显示该项目的名称(在MyHomePage
)。
这是我的进度,但我不知道如何向后传递值:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Search Bar Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
String _vehicleReg = "";
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: buildAppBar(),
body: buildUI(context),
);
}
Widget buildAppBar() {
return AppBar(title: Text('Search Reg Number'));
}
Widget buildUI(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
_buildVehicleRegTxtField(context),
SizedBox(height: 200),
selectedVehicle(),
],
);
}
Widget selectedVehicle() {
return Container(
child: Text(
'Selected vehicle will be displayed here.',
),
);
}
Widget _buildVehicleRegTxtField(BuildContext context) {
return TextFormField(
onSaved: (val) {
_vehicleReg = val;
},
readOnly: true,
onTap: () {
showSearch(context: context, delegate: PlateItemsSearch());
},
style: TextStyle(
color: Colors.blue,
fontFamily: 'OpenSans',
fontSize: 24,
),
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'Click for Vehicles',
),
);
}
}
class PlateItemsSearch extends SearchDelegate<PlateNumber> {
String selectedPlateNumber = "";
@override
List<Widget> buildActions(BuildContext context) {
return [
IconButton(
icon: Icon(Icons.clear),
onPressed: () {
query = "";
})
];
}
@override
Widget buildLeading(BuildContext context) {
return IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
close(context, null);
});
}
@override
Widget buildResults(BuildContext context) {
return Center(
child: Text(
selectedPlateNumber,
style: TextStyle(fontSize: 20),
),
);
}
@override
Widget buildSuggestions(BuildContext context) {
final myPlatesList = query.isEmpty
? loadPlateNumbers()
: loadPlateNumbers().where((plate) {
return plate.regNumber.contains(query);
}).toList();
return myPlatesList.isEmpty
? Text(
'Plate Not Found',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.w600),
)
: ListView.builder(
itemCount: myPlatesList.length,
itemBuilder: (context, index) {
final PlateNumber plateNumber = myPlatesList[index];
return ListTile(
leading: Icon(Icons.directions_car),
onTap: () {
showResults(context);
selectedPlateNumber = plateNumber.regNumber;
},
title: RichText(
text: TextSpan(
text: plateNumber.regNumber.substring(0, query.length),
style: TextStyle(
fontSize: 20,
color: Colors.black,
fontWeight: FontWeight.bold),
children: [
TextSpan(
text: plateNumber.regNumber.substring(query.length),
style: TextStyle(fontSize: 20, color: Colors.grey),
)
],
),
),
);
},
);
}
}
class PlateNumber {
final int id;
final String regNumber;
PlateNumber({this.id, this.regNumber});
}
List<PlateNumber> loadPlateNumbers() {
var pn = <PlateNumber>[
PlateNumber(id: 1, regNumber: 'DE99ABC'),
PlateNumber(id: 2, regNumber: 'AB22SDK'),
PlateNumber(id: 3, regNumber: 'KS88ASD'),
PlateNumber(id: 4, regNumber: 'NV37SSD'),
PlateNumber(id: 5, regNumber: 'PT20KLK'),
PlateNumber(id: 6, regNumber: 'TEST123'),
PlateNumber(id: 7, regNumber: 'VT20QWE'),
PlateNumber(id: 13, regNumber: 'JS23POP'),
PlateNumber(id: 14, regNumber: 'XX12WWW'),
PlateNumber(id: 15, regNumber: 'AB01RCA')
];
return pn;
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“搜索栏演示”,
主题:主题数据(原始样本:颜色。蓝色),
主页:MyHomePage(),
);
}
}
类MyHomePage扩展了无状态小部件{
字符串_vehicleReg=“”;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:buildAppBar(),
正文:buildUI(上下文),
);
}
Widget buildAppBar(){
返回AppBar(标题:文本(“搜索注册号”);
}
小部件构建UI(构建上下文){
返回列(
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
_buildVehicleRegTxtField(上下文),
尺寸箱(高度:200),
已选择车辆(),
],
);
}
Widget selectedVehicle(){
返回容器(
子:文本(
“选定的车辆将显示在此处。”,
),
);
}
Widget\u buildVehicleRegTxtField(BuildContext上下文){
返回TextFormField(
保存:(val){
_vehicleReg=val;
},
只读:对,
onTap:(){
showSearch(上下文:context,委托:PlateItemsSearch());
},
样式:TextStyle(
颜色:颜色,蓝色,
fontFamily:“OpenSans”,
尺寸:24,
),
装饰:输入装饰(
边框:InputBorder.none,
hintText:“单击查找车辆”,
),
);
}
}
类PlateItemsSearch扩展了SearchDelegate{
字符串selectedPlateNumber=“”;
@凌驾
列出buildActions(BuildContext上下文){
返回[
图标按钮(
图标:图标(图标。清除),
已按下:(){
query=“”;
})
];
}
@凌驾
小部件buildLeading(BuildContext上下文){
返回图标按钮(
图标:图标(图标。箭头返回),
已按下:(){
关闭(上下文,空);
});
}
@凌驾
小部件构建结果(构建上下文){
返回中心(
子:文本(
选择的车牌号,
样式:TextStyle(字体大小:20),
),
);
}
@凌驾
小部件构建建议(构建上下文){
final myPlatesList=query.isEmpty
?装载板编号()
:LoadPlateNumber()。其中((板){
返回板。注册号。包含(查询);
}).toList();
把我的盘子还给我
?文本(
“未找到车牌”,
样式:TextStyle(fontSize:24,fontWeight:fontWeight.w600),
)
:ListView.builder(
itemCount:myPlatesList.length,
itemBuilder:(上下文,索引){
最终板材编号板材编号=我的板材列表[索引];
返回列表块(
前导:图标(图标、方向和汽车),
onTap:(){
展示结果(背景);
selectedPlateNumber=plateNumber.regNumber;
},
标题:RichText(
text:TextSpan(
文本:plateNumber.regNumber.substring(0,query.length),
样式:TextStyle(
尺寸:20,
颜色:颜色,黑色,
fontWeight:fontWeight.bold),
儿童:[
TextSpan(
文本:plateNumber.regNumber.substring(query.length),
样式:TextStyle(字体大小:20,颜色:Colors.grey),
)
],
),
),
);
},
);
}
}
班牌号{
最终int id;
最终字符串regNumber;
PlateNumber({this.id,this.regNumber});
}
列表加载板编号(){
var pn=[
车牌号(id:1,regNumber:'DE99ABC'),
车牌号(id:2,注册号:“AB22SDK”),
车牌号(id:3,注册号:“KS88ASD”),
平板编号(id:4,regNumber:'NV37SSD'),
车牌号(id:5,注册号:'PT20KLK'),
平板编号(id:6,regNumber:'TEST123'),
车牌号(id:7,注册号:“VT20QWE”),
平板编号(id:13,regNumber:'JS23POP'),
车牌号(id:14,注册号:“XX12WWW”),
车牌号(id:15,注册号:'AB01RCA')
];
返回pn;
}
谢谢你读这篇文章 我将“MyHomePage”小部件从“无状态”更改为“Statefull”,以便在从搜索页面选择项目后刷新页面。
并在选择ListTile的项目时添加,调用“close”并返回值。
close(context, plateNumber);
这是您需要的完整代码。
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Search Bar Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String _vehicleReg = "";
PlateNumber selectedPlatItem;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: buildAppBar(),
body: buildUI(context),
);
}
Widget buildAppBar() {
return AppBar(title: Text('Search Reg Number'));
}
Widget buildUI(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
_buildVehicleRegTxtField(context),
SizedBox(height: 200),
selectedVehicle(),
],
);
}
Widget selectedVehicle() {
return Container(
child: Text(
selectedPlatItem == null
? 'Selected vehicle will be displayed here.'
: selectedPlatItem.regNumber,
),
);
}
Widget _buildVehicleRegTxtField(BuildContext context) {
return TextFormField(
onSaved: (val) {
_vehicleReg = val;
},
initialValue: selectedPlatItem?.regNumber,
readOnly: true,
onTap: () async {
selectedPlatItem =
await showSearch(context: context, delegate: PlateItemsSearch());
print(selectedPlatItem);
setState(() {});
},
style: TextStyle(
color: Colors.blue,
fontFamily: 'OpenSans',
fontSize: 24,
),
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'Click for Vehicles',
),
);
}
}
class PlateItemsSearch extends SearchDelegate<PlateNumber> {
@override
List<Widget> buildActions(BuildContext context) {
return [
IconButton(
icon: Icon(Icons.clear),
onPressed: () {
query = "";
})
];
}
@override
Widget buildResults(BuildContext context) {
return Container();
}
@override
Widget buildLeading(BuildContext context) {
return IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
close(context, null);
});
}
@override
Widget buildSuggestions(BuildContext context) {
final myPlatesList = query.isEmpty
? loadPlateNumbers()
: loadPlateNumbers().where((plate) {
return plate.regNumber.contains(query);
}).toList();
return myPlatesList.isEmpty
? Text(
'Plate Not Found',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.w600),
)
: ListView.builder(
itemCount: myPlatesList.length,
itemBuilder: (context, index) {
final PlateNumber plateNumber = myPlatesList[index];
return ListTile(
leading: Icon(Icons.directions_car),
onTap: () {
showResults(context);
close(context, plateNumber);
},
title: RichText(
text: TextSpan(
text: plateNumber.regNumber.substring(0, query.length),
style: TextStyle(
fontSize: 20,
color: Colors.black,
fontWeight: FontWeight.bold),
children: [
TextSpan(
text: plateNumber.regNumber.substring(query.length),
style: TextStyle(fontSize: 20, color: Colors.grey),
)
],
),
),
);
},
);
}
}
class PlateNumber {
final int id;
final String regNumber;
PlateNumber({this.id, this.regNumber});
}
List<PlateNumber> loadPlateNumbers() {
var pn = <PlateNumber>[
PlateNumber(id: 1, regNumber: 'DE99ABC'),
PlateNumber(id: 2, regNumber: 'AB22SDK'),
PlateNumber(id: 3, regNumber: 'KS88ASD'),
PlateNumber(id: 4, regNumber: 'NV37SSD'),
PlateNumber(id: 5, regNumber: 'PT20KLK'),
PlateNumber(id: 6, regNumber: 'TEST123'),
PlateNumber(id: 7, regNumber: 'VT20QWE'),
PlateNumber(id: 13, regNumber: 'JS23POP'),
PlateNumber(id: 14, regNumber: 'XX12WWW'),
PlateNumber(id: 15, regNumber: 'AB01RCA')
];
return pn;
}
[1]: https://i.stack.imgur.com/EtsuA.gif
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“搜索栏演示”,
主题:主题数据(原始样本:颜色。蓝色),
主页:MyHomePage(),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key}):超级(Key:Key);
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
字符串_vehicleReg=“”;
选择的车牌号PlatItem;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:buildAppBar(),
正文:buildUI(上下文),
);
}
Widget buildAppBar(){
返回AppBar(标题:文本(“搜索注册号”);
}
小部件构建UI(构建上下文){
返回列(
交叉