Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在Flatter中将搜索栏中的值传递到上一个屏幕_Flutter_Dart - Fatal编程技术网

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(构建上下文){
返回列(
交叉