You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter 如何将SearchDelegate选中结果传递到下一个页面

问题解决方法

实现点击传参只需要两步,先改造详情页接收参数,再在列表点击时传入对应数据即可。

1. 改造Handout详情页

打开Handout.dart,给Handout组件增加员工数据入参,示例结构如下:

import 'package:vms_1/DATALIST.dart';
import 'package:flutter/material.dart';

class Handout extends StatelessWidget {
  // 新增入参,接收传入的单条员工完整数据
  final Datalist employeeInfo;
  const Handout({super.key, required this.employeeInfo});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(employeeInfo.name ?? '员工详情'),
      ),
      // 页面其余部分直接通过employeeInfo.name、employeeInfo.email等属性取值渲染即可
      body: Container(
        padding: EdgeInsets.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('姓名:${employeeInfo.name}'),
            Text('邮箱:${employeeInfo.email}'),
            // 其他字段按需渲染
          ],
        ),
      ),
    );
  }
}

注意:Dart类名规范要求使用大驼峰命名,建议将原代码里的handout()统一改为Handout(),避免语法报错

2. 修改两个列表的点击跳转逻辑

你在buildResults和buildSuggestions的ListView itemBuilder中,已经通过final emp = data![index];拿到了当前点击条目的完整Datalist实例,跳转时直接把这个实例传给Handout页面即可。

替换buildResults中ListTile的onTap代码

onTap: () {
  Navigator.of(context).push(
    MaterialPageRoute(
      builder: (BuildContext context) => Handout(employeeInfo: emp),
    ),
  );
},

补全buildSuggestions中ListTile的onTap代码

原来这里的onTap是空实现,直接填入和上面完全一致的跳转代码即可:

onTap: () {
  Navigator.of(context).push(
    MaterialPageRoute(
      builder: (BuildContext context) => Handout(employeeInfo: emp),
    ),
  );
},
修改后完整的SearchUser代码
import 'package:flutter/material.dart';
import 'package:vms_1/DATALIST.dart';
import 'package:vms_1/Handout.dart';
import 'api_service.dart';

class SearchUser extends SearchDelegate {
  FetchUserList _Datalist = FetchUserList();

  @override
  ThemeData appBarTheme(BuildContext context) {
    final ThemeData theme = Theme.of(context);
    return theme.copyWith(
      primaryColor: theme.backgroundColor,
      primaryIconTheme: theme.iconTheme,
      primaryColorBrightness: theme.primaryColorBrightness,
      primaryTextTheme: theme.primaryTextTheme,
    );
  }

  @override
  List<Widget> buildActions(BuildContext context) {
    return [
      IconButton(
          color: Colors.white,
          onPressed: () {
            query = '';
          },
          icon: Icon(Icons.close))
    ];
  }

  @override
  Widget buildLeading(BuildContext context) {
    return IconButton(
      onPressed: () {
        Navigator.pop(context);
      },
      icon: Icon(Icons.arrow_back),
    );
  }

  @override
  Widget buildResults(BuildContext context) {
    return Container(
      width: double.infinity,
      decoration: const BoxDecoration(
        gradient: const LinearGradient(
            begin: Alignment.topCenter,
            end: Alignment.bottomRight,
            colors: [
              Colors.deepPurple,
              Colors.lightBlueAccent,
            ]),
      ),
      child: FutureBuilder<List<Datalist>>(
          future: _Datalist.getDatalist(query: query),
          builder: (context, snapshot) {
            if (!snapshot.hasData) {
              return Center(
                child: CircularProgressIndicator(),
              );
            }
            List<Datalist>? data = snapshot.data;
            return ListView.builder(
                itemCount: data?.length,
                itemBuilder: (context, index) {
                  final emp = data![index];
                  return Container(
                    margin: EdgeInsets.all(10),
                    child: Card(
                      margin: const EdgeInsets.all(0),
                      elevation: 2.0,
                      child: ListTile(
                        title: Text('${data?[index].name}'),
                        subtitle: Text('${data?[index].email}'),
                        trailing: Icon(Icons.arrow_forward),
                        onTap: () {
                          Navigator.of(context).push(
                            MaterialPageRoute(
                              builder: (BuildContext context) => Handout(employeeInfo: emp),
                            ),
                          );
                        },
                      ),
                    ),
                  );
                });
          }),
    );
  }

  @override
  Widget buildSuggestions(BuildContext context) {
    return Scaffold(
      body: Container(
        width: double.infinity,
        decoration: const BoxDecoration(
          gradient: LinearGradient(
              begin: Alignment.topCenter,
              end: Alignment.bottomRight,
              colors: [
                Colors.deepPurple,
                Colors.lightBlueAccent,
              ]),
        ),
        child: FutureBuilder<List<Datalist>>(
            future: _Datalist.getDatalist(query: query),
            builder: (context, snapshot) {
              if (!snapshot.hasData) {
                return Center(
                  child: CircularProgressIndicator(),
                );
              }
              List<Datalist>? data = snapshot.data;
              return ListView.builder(
                  itemCount: data?.length,
                  itemBuilder: (context, index) {
                    final emp = data![index];
                    return Container(
                      margin: EdgeInsets.all(10),
                      child: Card(
                        margin: const EdgeInsets.all(0),
                        elevation: 2.0,
                        child: ListTile(
                          title: Text('${data?[index].name}'),
                          subtitle: Text('${data?[index].email}'),
                          trailing: Icon(Icons.arrow_forward),
                          onTap: () {
                            Navigator.of(context).push(
                              MaterialPageRoute(
                                builder: (BuildContext context) => Handout(employeeInfo: emp),
                              ),
                            );
                          },
                        ),
                      ),
                    );
                  });
            }),
      ),
    );
  }
}

改完之后不管是点搜索结果还是点搜索建议,都会把对应条目的完整员工数据传到Handout页面,直接在Handout里通过employeeInfo对象取对应字段渲染即可。

内容的提问来源于stack exchange,提问作者Samsudeen S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 21:03:18