我无法在TabBarView中进行搜索和过滤,我try 过这样

import 'dart:async';
import 'dart:developer';
import 'package:aliseo_app/models/web_scrapping.dart';
import 'package:aliseo_app/variables/global_variables.dart';
import 'package:flutter/material.dart';
import '../widgets/image_container.dart';


dynamic article;
class HomeScreen extends StatefulWidget {
  const HomeScreen({super.key});

  static const routeName = '/home';

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {

  TextEditingController searchController = TextEditingController();
  int selectIndex = 0;
  String searchQuery = '';

  void updateSearchQuery(String query) {
    final suggestion = article.where((art){
      final articlesTitle = art.title.toLowerCase();
      final input = query.toLowerCase();

      return articlesTitle.contains(input);
    }).toList();

    setState(() => article = suggestion);
  }

  Future newsControl() async {
    await getData();
    setState(() {});
  }

  @override
  void initState() {
    newsControl();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    List<String> tabs = ['Esteri', 'Politica', 'Economia', 'Cultura'];

    return DefaultTabController(
        initialIndex: 0,
        length: tabs.length,
        child: Scaffold(
          backgroundColor: const Color(0xffEEE2DE),
          appBar: AppBar(
            backgroundColor: Colors.transparent,
            elevation: 0,
            leading: IconButton(
                onPressed: () {},
                icon: const Icon(
                  Icons.menu,
                  color: Colors.white,
                )),
          ),
          extendBodyBehindAppBar: true,
          //bottomNavigationBar: const BottomNavBar(
          //  index: 0,
          //),
          body: ListView(
            padding: EdgeInsets.zero,
            children: [
              const _TitleScreen(),
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: SizedBox(
                  height: MediaQuery.of(context).size.height * 0.06,
                  child: TextFormField(
                    onChanged: updateSearchQuery,
                    controller: searchController,
                    decoration: InputDecoration(
                        enabled: true,
                        hintText: 'Cerca',
                        fillColor: const Color(0xffEA906C),
                        filled: true,
                        prefixIcon: const Icon(
                          Icons.search,
                          color: Colors.black,
                        ),
                        suffixIcon: const RotatedBox(
                          quarterTurns: 1,
                          //child: Icon(
                          //  Icons.tune,
                          //  color: Colors.grey,
                          //)
                        ),
                        border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(20),
                            borderSide: BorderSide.none)),
                  ),
                ),
              ),
              Column(
                children: [
                  TabBar(
                      tabAlignment: TabAlignment.start,
                      labelPadding: const EdgeInsets.only(right: 10),
                      dividerColor: Colors.transparent,
                      indicatorSize: TabBarIndicatorSize.label,
                      isScrollable: true,
                      indicatorColor: const Color(0xff000f24),
                      tabs: tabs
                          .map((tab) => SizedBox(
                        width: 110,
                        child: Tab(
                          icon: Text(
                            tab,
                            style: Theme.of(context)
                                .textTheme
                                .headlineSmall!
                                .copyWith(fontWeight: FontWeight.bold),
                          ),
                        ),
                      ))
                          .toList()),
                  SizedBox(
                    height: MediaQuery.of(context).size.height * 0.60,
                    child: TabBarView(
                        children: tabs
                            .map(
                              (tab) => ListView.builder(
                              padding: EdgeInsets.zero,
                              shrinkWrap: true,
                              itemCount: articles[tab]!.length,
                              itemBuilder: ((context, index) {
                                final article = articles[tab]![index];
                                return Row(
                                  children: [
                                    ImageContainer(
                                      width: MediaQuery.of(context).size.width*0.40,
                                      height: 100,
                                      imageUrl: article.imageUrl,
                                      margin: const EdgeInsets.all(10.0),
                                      borderRadius: 5,

                                    ),
                                    Expanded(
                                      child: Column(
                                        crossAxisAlignment:
                                        CrossAxisAlignment.start,
                                        children: [
                                          Text(
                                            article.title,
                                            maxLines: null,
                                            overflow: TextOverflow.clip,
                                            style: Theme.of(context)
                                                .textTheme
                                                .titleSmall!
                                                .copyWith(
                                                fontWeight:
                                                FontWeight.bold),
                                          ),
                                          Text(
                                            article.createdAt,
                                            maxLines: 2,
                                            overflow: TextOverflow.clip,
                                            style: Theme.of(context)
                                                .textTheme
                                                .bodySmall!,
                                          ),
                                        ],
                                      ),
                                    ),
                                  ],
                                );
                              })),
                        )
                            .toList()),
                  ),
                ],
              ),
            ],
          ),
        ));

  }

}

class _TitleScreen extends StatelessWidget {
  const _TitleScreen({
    super.key,
  });

  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: const BoxDecoration(
          borderRadius: BorderRadius.only(
              bottomLeft: Radius.circular(20),
              bottomRight: Radius.circular(20)),
          color: Color(0xff000f24)),
      child: Padding(
        padding: const EdgeInsets.all(20.0),
        child: ImageContainer(
          height: MediaQuery.of(context).size.height * 0.19,
          width: MediaQuery.of(context).size.width,
          padding: const EdgeInsets.all(20.0),
          imageUrl:
              'https://aliseoeditoriale.it/wp-content/uploads/2022/06/logo-aliseo-footer.png',
        ),
      ),
    );
  }
}

当我在搜索框中搜索时,屏幕以正确的方式重新加载,但我仍然看到所有的文章好像什么都没有发生,我try 在线搜索,但找不到一种方法.文章是一个全局变量,是一个以字符串为键、以文章数组为值的映射

Map<String, List<Article>> articles = {
'Esteri': foreignArticles,
'Politica': politicsArticles,
'Economia': economicsArticles,
'Cultura': cultureArticles,};

你们能帮我弄清楚吗?

推荐答案

您可以这样实现:

class MyWidget extends StatefulWidget {
  const MyWidget({super.key});

  @override
  State<MyWidget> createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  Map<String, List<Article>> articles = {
    'Esteri': foreignArticles,
    'Politica': politicsArticles,
    'Economia': economicsArticles,
    'Cultura': cultureArticles,
  };
  String query = '';

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: articles.length,
      child: Scaffold(
        body: Column(
          children: [
            TextField(
              onChanged: (value) {
                setState(() {
                  query = value;
                });
              },
            ),
            Expanded(
              child: TabBarView(
                children: [
                  for (final entry in articles.entries)
                    TabContents(
                      list: entry.value,
                      query: query,
                    ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class TabContents extends StatelessWidget {
  const TabContents({
    super.key,
    required this.list,
    required this.query,
  });

  final List<Article> list;
  final String query;

  @override
  Widget build(BuildContext context) {
    List<Article> filteredList;

    if (query.isEmpty) {
      filteredList = [...list];
    } else {
      filteredList = [
        for (final e in list)
          if (e.title.toLowerCase().contains(query.toLowerCase())) e,
      ];
    }

    return ListView.builder(
      itemCount: filteredList.length,
      itemBuilder: (context, index) {
        return Text(
          filteredList[index].title,
        );
      },
    );
  }
}

Flutter相关问答推荐

实现Popscope在按下返回按钮两次后退出应用程序

Flutter ReorderableListView在可滚动父级中无法完美工作

Box约束强制无限高:SizedBox. Expand()

如何在Flutter 中播放音频

为什么要在值列表中两次放入空安全性

CMakeLists.txt处的CMake错误:3(项目)找不到指定的Visual Studio实例

如何将assets资源 实体类型转换为文件类型?

如何从DART中的事件列表中获取即将到来的日期

不要跨同步间隔使用BuildContext

如何在flutter中实现这样的底部导航栏?

没有为类型 'Widget' 定义运算符 '[]' .try 定义运算符[]

如何获取flutter中gridview项目占用的高度和宽度?

Flutter中pubspec.yaml文件中的name参数是什么?

在使用 Android 12+ 的真实 Android 设备上,SingleChildScrollView 中最初位于视口之外的无响应 Web 视图

Flutter:如何在现有布局之上显示圆角布局?

Firestore 使用 Flutter 以奇怪的格式保存数据

如何(部分)更新 riverpod 中的 AsyncValue?

从子类调用超类的超方法

在 Dart 中使用隔离时访问外部范围内的变量

我几乎每次都将 Stateless Widget 与 BLoC 一起使用.我错了吗?