首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在此Provider<Movies> Widget之上找到正确的MyApp

无法在此Provider<Movies> Widget之上找到正确的MyApp
EN

Stack Overflow用户
提问于 2022-04-06 17:40:58
回答 2查看 81关注 0票数 0

所以,我在一个应用程序中使用BLoC和提供者包。在我的“moviesprovider.dart”中,当应用程序第一次打开时,我从返回json的API中获取一些数据。如何从Provider.of中的main.dart (上下文)访问MultiProvider?基本上,我想访问列表电影的同一个实例,但不知道如何访问。

我所犯的错误:

错误:无法在此MyApp Widget之上找到正确的提供程序

这是因为您使用了不包括您选择的提供者的BuildContext

代码:Main.dart

代码语言:javascript
复制
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  MyApp({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider.value(
          value: Movies(),
        ),
        Provider<SwipeBloc>(create: (_) {
          SwipeBloc()
            ..add(
              LoadMoviesEvent(
                movies: context.read<Movies>().movies,
              ),
            );
        }),
        ChangeNotifierProvider.value(
          value: User(),
        ),
        ChangeNotifierProvider.value(
          value: Auth(),
        ),
      ],
      child: ...
  }
}

movies_provider.dart

代码语言:javascript
复制
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:movies_recomendations/constants.dart';
import 'package:http/http.dart' as http;

import './single_movie_provider.dart';

class Movies with ChangeNotifier {
  String plotText = "";

  List<Movie> _movies = [];

  List<Movie> get movies {
    return <Movie>[..._movies];
  }

  .....

  Future<void> fetchAndSetMovies() async {
    const url = 'http://192.168.1.142:8000/Desktop/textData.json';

    try {
      final response = await http.get(
        Uri.parse(url),
      );
      String source = Utf8Decoder().convert(response.bodyBytes);

      final extractedData =
          List<Map<String, dynamic>>.from(json.decode(source));
      final List<Movie> loadedMovies = [];

      extractedData.forEach(
        ((movieInfo) => {
              loadedMovies.add(Movie(
                id: movieInfo['id'],
                age: 12,
                countries: List<String>.from(movieInfo['country']),
                description: movieInfo['descriprion'],
                frames: movieInfo['frames'],
                genre: movieInfo['genre'],
                poster: movieInfo['poster'],
                premiereWorld: movieInfo['date'].toString(),
                ratingIMDb: movieInfo['ratingIMDb'],
                ratingKinopoisk: movieInfo['ratingKinopoisk'],
                title: movieInfo['title'][1],
                ifSeries: movieInfo['ifSeries'],
                dateTo: movieInfo['dateTo'].toString(),
                isFavourite: true,
                seasons: movieInfo['seasons'],
              )),
            }),
      );
      _movies = loadedMovies;
      notifyListeners();
    } on Exception catch (e) {
      print('error');
      print(e.toString());
    }
  }
}

Swipe_event.dart

代码语言:javascript
复制
part of 'swipe_block.dart';

abstract class SwipeEvent extends Equatable {
  const SwipeEvent();

  @override
  List<Object> get props => [];
}

class LoadMoviesEvent extends SwipeEvent {
  final List<Movie> movies ;

  LoadMoviesEvent({
    required this.movies,
  });

  @override
  List<Object> get props => [movies];
}

class SwipeLeftEvent extends SwipeEvent {
  final Movie movie;

  SwipeLeftEvent({
    required this.movie,
  });

  @override
  List<Object> get props => [movie];
}

class SwipeRightEvent extends SwipeEvent {
  final Movie movie;

  SwipeRightEvent({
    required this.movie,
  });

  @override
  List<Object> get props => [movie];
}
EN

回答 2

Stack Overflow用户

发布于 2022-04-06 17:54:51

您可能需要将调用Provider.of(context)的代码移动到它自己的小部件中。正如错误所暗示的那样,您不能使用提供程序在您用来设置提供程序作用域的同一个BuildContext中检索依赖项。创建一个新的小部件还会生成一个新的BuildContext。

如果确实需要在定义Provider.of(context)的同一个类中使用MultiProvider,则可以使用构建器小部件生成新的上下文。

票数 0
EN

Stack Overflow用户

发布于 2022-04-06 18:39:08

因此,要解决这个问题,不应该在BlocProvider中使用main.dart。您应该在实现BLoC提供程序的直接小部件中使用它。所以我在一个屏幕引用中使用它,所以我把它写成这样

代码语言:javascript
复制
class RecomendationsScreen extends StatelessWidget {
  static const routeName = '/recomendations';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: kBackgroundColor,
      body: BlocProvider(
        create: (_) => SwipeBloc()
          ..add(
            LoadMoviesEvent(
              movies: Provider.of<Movies>(context).movies,
            ),
          ),
        child: RecomendationsBody(),
      ),
    );
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71771371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档