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

如何在Flutter的searchDelegate函数中导入WordPress博客页面的API数据

实现方案

步骤1:自定义带参数的SearchDelegate

你需要先自己实现搜索代理类,通过构造函数接收外部传入的新闻数据,示例代码如下:

import 'package:flutter/material.dart';

class NewsSearchDelegate extends SearchDelegate {
  // 存储传入的新闻列表数据
  final List newsArticles;

  // 构造函数,初始化时接收新闻数据
  NewsSearchDelegate(this.newsArticles);

  @override
  List<Widget>? buildActions(BuildContext context) {
    // 搜索框右侧操作区,这里加一个清空输入的按钮
    return [
      IconButton(
        icon: const Icon(Icons.clear),
        onPressed: () => query = '',
      )
    ];
  }

  @override
  Widget? buildLeading(BuildContext context) {
    // 搜索框左侧返回按钮
    return IconButton(
      icon: const Icon(Icons.arrow_back),
      onPressed: () => close(context, null),
    );
  }

  @override
  Widget buildResults(BuildContext context) {
    // 根据输入的关键词过滤新闻列表
    final filterList = newsArticles.where((article) {
      final newsTitle = article['title']['rendered'].toString().toLowerCase();
      return newsTitle.contains(query.toLowerCase());
    }).toList();

    return ListView.builder(
      itemCount: filterList.length,
      itemBuilder: (context, index) {
        final item = filterList[index];
        return ListTile(
          title: Text(item['title']['rendered']),
          // 去除摘要里的HTML标签
          subtitle: Text(item['excerpt']['rendered'].replaceAll(RegExp(r'<[^>]*>'), '')),
        );
      },
    );
  }

  @override
  Widget buildSuggestions(BuildContext context) {
    // 搜索建议逻辑,这里直接复用结果逻辑,也可以按需自定义
    if (query.isEmpty) {
      return const Center(child: Text('请输入搜索关键词'));
    }
    return buildResults(context);
  }
}

步骤2:触发搜索时传入API数据

在你页面点击搜索按钮的位置,先调用你封装的API接口获取数据,再把数据传给上面自定义的搜索代理即可,示例代码如下:

// 页面AppBar的配置示例
AppBar(
  title: const Text('新闻列表'),
  actions: [
    IconButton(
      icon: const Icon(Icons.search),
      onPressed: () async {
        final apiService = ApiNewsPage();
        try {
          // 先请求拿到新闻列表数据
          final newsList = await apiService.getNewsArticles();
          if (context.mounted) {
            // 把数据传入搜索代理,打开搜索页
            showSearch(
              context: context,
              delegate: NewsSearchDelegate(newsList),
            );
          }
        } catch (e) {
          // 错误提示处理
          if (context.mounted) {
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text(e.toString())),
            );
          }
        }
      },
    )
  ],
)

如果你不想每次点击搜索都重新请求接口,可以在当前页面初始化时就提前请求好新闻数据存在State中,点击搜索时直接传缓存的数据即可,减少重复请求。

内容的提问来源于stack exchange,提问作者Pimpi Rimpà

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:42:03