所以,我在一个应用程序中使用BLoC和提供者包。在我的“moviesprovider.dart”中,当应用程序第一次打开时,我从返回json的API中获取一些数据。如何从Provider.of中的main.dart (上下文)访问MultiProvider?基本上,我想访问列表电影的同一个实例,但不知道如何访问。
我所犯的错误:
错误:无法在此MyApp Widget之上找到正确的提供程序
这是因为您使用了不包括您选择的提供者的BuildContext。
代码:Main.dart
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
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
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];
}发布于 2022-04-06 17:54:51
您可能需要将调用Provider.of(context)的代码移动到它自己的小部件中。正如错误所暗示的那样,您不能使用提供程序在您用来设置提供程序作用域的同一个BuildContext中检索依赖项。创建一个新的小部件还会生成一个新的BuildContext。
如果确实需要在定义Provider.of(context)的同一个类中使用MultiProvider,则可以使用构建器小部件生成新的上下文。
发布于 2022-04-06 18:39:08
因此,要解决这个问题,不应该在BlocProvider中使用main.dart。您应该在实现BLoC提供程序的直接小部件中使用它。所以我在一个屏幕引用中使用它,所以我把它写成这样
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(),
),
);
}
}https://stackoverflow.com/questions/71771371
复制相似问题