在构建期间调用 setState() 或 markNeedsBuild(),尽管应用程序正常工作,但仍停留在这个问题上

问题描述 投票:0回答:1

这是我的主屏幕,它工作正常,但每次我导航到它时都会抛出错误。 我不知道该怎么办,所有应用程序都正常工作,只是抛出此错误,我想修复此问题。

班级:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'package:gap/gap.dart';
import 'package:ronasapp/providers/providers.dart';
import 'package:ronasapp/screens/screens.dart';
import 'package:ronasapp/utils/extensions.dart';
import '../widgets/widgets.dart';

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

  @override
  Widget build(BuildContext context) {
    final movieProvider = Provider.of<Movies>(context, listen: false);
    final directorProvider = Provider.of<Directors>(context, listen: false);
    final genreProvider = Provider.of<Genres>(context, listen: false);

    return Scaffold(
      extendBody: true,
      resizeToAvoidBottomInset: true,
      body: SafeArea(
        child: Stack(
          children: [
            SingleChildScrollView(
              child: Padding(
                padding:
                    const EdgeInsets.symmetric(vertical: 16.0, horizontal: 16),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Padding(
                      padding: const EdgeInsets.symmetric(vertical: 10),
                      child: Text(
                        "Popular directors",
                        style: context.textTheme.titleLarge!.copyWith(
                          fontWeight: FontWeight.w400,
                          fontSize: 26,
                        ),
                      ),
                    ),
                    //directors list
                    SizedBox(
                      height: 140,
                      child: ListView.separated(
                        scrollDirection: Axis.horizontal,
                        itemCount: directorProvider.directors.length,
                        itemBuilder: (context, index) {
                          final director = directorProvider.directors[index];
                          return GestureDetector(
                            onTap: () {
                              Navigator.of(context).pushNamed(
                                  DirectorDetails.routeName,
                                  arguments: director);
                            },
                            child: DirectorAvatar(
                              director: director,
                            ),
                          );
                        },
                        separatorBuilder: ((context, index) => const Gap(5)),
                      ),
                    ),
                    const WhiteLargeText(text: "Trending"),
                    const Gap(10),
                    //new movies
                    FutureBuilder(
                      future: movieProvider.getTrendingMovies(),
                      builder: (context, snapshot) {
                        if (snapshot.connectionState ==
                            ConnectionState.waiting) {
                          return const Center(
                            child: CircularProgressIndicator(),
                          );
                        } else if (snapshot.hasData) {
                          final data = snapshot.data;
                          return MovieCardsList(movies: data!);
                        } else if (snapshot.hasError) {
                          return Text(snapshot.error.toString());
                        } else {
                          return const Text("Error");
                        }
                      },
                    ),
                    const WhiteLargeText(text: "Genres"),
                    const Gap(10),
                    FutureBuilder(
                        future: genreProvider.getGenres(),
                        builder: (context, snapshot) {
                          if (snapshot.connectionState ==
                              ConnectionState.waiting) {
                            return const Center(
                                child: CircularProgressIndicator());
                          } else if (snapshot.hasData) {
                            return SizedBox(
                              height: 110,
                              child: ListView.separated(
                                scrollDirection: Axis.horizontal,
                                itemBuilder: (context, index) {
                                  final genre = genreProvider.genres[index];
                                  final moviesInGenre =
                                      movieProvider.getMoviesByGenre(genre.id);
                                  return GestureDetector(
                                      onTap: () {
                                        Navigator.of(context).pushNamed(
                                          SpecificCategoryScreen.routeName,
                                          arguments: [
                                            genre.name,
                                            moviesInGenre
                                          ],
                                        );
                                      },
                                      child: GenreCard(genre: genre));
                                },
                                separatorBuilder: (context, index) =>
                                    const Gap(10),
                                itemCount: genreProvider.genres.length,
                              ),
                            );
                          } else {
                            return const Text("Error");
                          }
                        }),

                    const Gap(20),
                    const WhiteLargeText(text: "Coming soon"),
                    const Gap(10),
                    const ComingSoonMovieCard(),
                    // const Gap(70),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

错误是这样的:在构建期间调用了 setState() 或 markNeedsBuild()。 我在另一个屏幕上使用 MediaQuery ,在错误中我看到它说,调用 MediaQuery 时小部件构建,但我找不到它的链接。

flutter widget setstate stateless
1个回答
0
投票

检查哪个提供商引发了错误,并将此代码添加到该提供商

  @override
  void notifyListeners() {
    WidgetsBinding.instance.addPostFrameCallback(
      (_) {
        super.notifyListeners();
      },
    );
  }
© www.soinside.com 2019 - 2024. All rights reserved.