Flutter 如何在同一屏幕上正确使用具有两个事件的BLoC?
我正在尝试创建一个具有bloc和clean架构的电影应用程序,我想展示流行电影和顶级电影,但我只能展示其中一部。我在两个用例中使用相同的bloc 我做错了什么?我应该用两个集团吗 我将发布一些代码,但这里是完整的演示。提前谢谢 main.dartFlutter 如何在同一屏幕上正确使用具有两个事件的BLoC?,flutter,flutter-bloc,Flutter,Flutter Bloc,我正在尝试创建一个具有bloc和clean架构的电影应用程序,我想展示流行电影和顶级电影,但我只能展示其中一部。我在两个用例中使用相同的bloc 我做错了什么?我应该用两个集团吗 我将发布一些代码,但这里是完整的演示。提前谢谢 main.dart 导入“包装:颤振/材料.省道”; 进口“包装:颤振团/颤振团.飞镖”; 导入“包:prueba_gbp/演示文稿/blocs/home_bloc/home_cubit.dart”; 导入“包:prueba_gbp/presentation/screen
导入“包装:颤振/材料.省道”;
进口“包装:颤振团/颤振团.飞镖”;
导入“包:prueba_gbp/演示文稿/blocs/home_bloc/home_cubit.dart”;
导入“包:prueba_gbp/presentation/screens/home_screen.dart”;
作为di导入“injection_container.dart”;
void main()异步{
WidgetsFlutterBinding.ensureInitialized();
等待di.init();
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回BlocProvider(
create:(context)=>di.sl()…getPopularMovies()…getTopRatedMovies(),
孩子:MaterialApp(
主页:主屏幕(),
),
);
}
}
home_cubit.dart
import'包:bloc/bloc.dart';
导入“包:equalable/equalable.dart”;
导入“package:prueba_gbp/domain/entities/movie_entity.dart”;
导入“package:prueba_gbp/domain/usecases/get_populares_movies.dart”;
导入“包:prueba_gbp/domain/usecases/get_top_rated_movies.dart”;
第二部分“家乡之州.飞镖”;
类HomeCubit扩展了Cubit{
最终GetPopularesMoviesUseCase GetPopularesMoviesUseCase;
最终GetTopRatedMoviesUseCase GetTopRatedMoviesUseCase;
HomeCubit({this.getPopulareMoviesUseCase,this.getTopRatedMoviesUseCase})
:super(MoviesInitial());
未来的getPopularMovies()异步{
试一试{
emit(MoviesLoadingState());
final popularMovies=等待GetPopularMoviesUseCase.call();
发射(PopularMoviesLoadedState(popularMovies));
}捕获(e){
印刷品(e);
}
}
未来的getTopRatedMovies()异步{
试一试{
emit(MoviesLoadingState());
final topRatedMovies=等待getTopRatedMoviesUseCase.call();
发射(TopRatedMoviesLoadedState(topRatedMovies));
}捕获(e){
印刷品(e);
}
}
}
家乡州。省道
home_cubit.dart'的一部分;
抽象类HomeState扩展了Equatable{
const HomeState();
}
阶级电影最初扩展了家园{
const MoviesInitial();
@凌驾
//TODO:实现道具
List get props=>throw UnimplementedError();
}
类MoviesLoadingState扩展了HomeState{
@凌驾
列表获取道具=>[];
}
类PopularsMoviesLoadedState扩展HomeState{
电影的最终名单;
PopularsMoviesLoadedState(this.popularsMovies);
@凌驾
列表获取道具=>[PopularResMovies];
}
类TopRatedMoviesLoadedState扩展HomeState{
最终排名最高的影片名单;
TopRatedMoviesLoadedState(this.topRatedMovies);
@凌驾
列表获取道具=>[topRatedMovies];
}
注射容器。省道
import'package:get_it/get_it.dart';
将“package:http/http.dart”导入为http;
导入“包:prueba_gbp/data/data_source/movies_remote_data_source.dart”;
导入“包:prueba_gbp/data/data_source/movies_remote_data_source_impl.dart”;
导入“包:prueba_gbp/data/repositories/movies_repository_impl.dart”;
导入“package:prueba_gbp/domain/repositories/movies_repository.dart”;
导入“package:prueba_gbp/domain/usecases/get_populares_movies.dart”;
导入“包:prueba_gbp/domain/usecases/get_top_rated_movies.dart”;
导入“包:prueba_gbp/演示文稿/blocs/home_bloc/home_cubit.dart”;
final sl=GetIt.instance;
Future init()异步{
//期货集团
sl.registerFactory(()=>HomeCubit(
GetPopulareMoviesUseCase:sl.call(),
getTopRatedMoviesUseCase:sl.call()
));
//用例
sl.registerLazySingleton(()=>GetPopulareMoviesUseCase(存储库:sl.call());
sl.registerLazySingleton(()=>GetToPatedMoviesUseCase(存储库:sl.call());
//存储库
sl.registerLazySingleton(()=>MoviesRepositoryImpl(remoteDataSource:sl.call());
//远程数据
sl.registerLazySingleton(()=>MoviesRemoteDataSourceImpl(客户端:sl.call());
//外部的
sl.registerLazySingleton(()=>http.Client());
}
主屏幕。省道
类主屏幕扩展StatefulWidget{
@凌驾
_HomeScreenState createState()=>\u HomeScreenState();
}
类_homescrenstate扩展状态{
@凌驾
小部件构建(构建上下文){
Size Size=MediaQuery.of(context).Size;
返回脚手架(
背景颜色:颜色。蓝色[200],
正文:SingleChildScrollView(
子项:_buildBody(大小、上下文)
),
);
}
_buildBody(大小、BuildContext上下文){
返回列(
儿童:[
大小盒子(
高度:size.height,
子:堆栈(
儿童:[
容器(
填充:边缘组。对称(水平:20,垂直:20),
高度:尺寸。高度*0.7,
宽度:double.infinity,
页边空白:仅限边缘组(顶部:尺寸高度*0.3),
装饰:盒子装饰(
颜色:颜色,白色,
borderRadius:仅限borderRadius(
左上:半径。圆形(24),
右上角:半径。圆形(24),
)
),
子:列(
儿童:[
尺寸箱(高度:10.0),
划船(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
正文(
"大众",,
样式:TextStyle(
fontWeight:fontWeight.bold
),
),
正文(
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:prueba_gbp/presentation/blocs/home_bloc/home_cubit.dart';
import 'package:prueba_gbp/presentation/screens/home_screen.dart';
import 'injection_container.dart' as di;
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await di.init();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => di.sl<HomeCubit>()..getPopularMovies()..getTopRatedMovies(),
child: MaterialApp(
home: HomeScreen(),
),
);
}
}
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:prueba_gbp/domain/entities/movie_entity.dart';
import 'package:prueba_gbp/domain/usecases/get_populares_movies.dart';
import 'package:prueba_gbp/domain/usecases/get_top_rated_movies.dart';
part 'home_state.dart';
class HomeCubit extends Cubit<HomeState> {
final GetPopularesMoviesUseCase getPopularesMoviesUseCase;
final GetTopRatedMoviesUseCase getTopRatedMoviesUseCase;
HomeCubit({this.getPopularesMoviesUseCase, this.getTopRatedMoviesUseCase})
: super(MoviesInitial());
Future<void> getPopularMovies() async {
try {
emit(MoviesLoadingState());
final popularMovies = await getPopularesMoviesUseCase.call();
emit(PopularesMoviesLoadedState(popularMovies));
} catch (e) {
print(e);
}
}
Future<void> getTopRatedMovies() async {
try {
emit(MoviesLoadingState());
final topRatedMovies = await getTopRatedMoviesUseCase.call();
emit(TopRatedMoviesLoadedState(topRatedMovies));
} catch (e) {
print(e);
}
}
}
part of 'home_cubit.dart';
abstract class HomeState extends Equatable {
const HomeState();
}
class MoviesInitial extends HomeState {
const MoviesInitial();
@override
// TODO: implement props
List<Object> get props => throw UnimplementedError();
}
class MoviesLoadingState extends HomeState{
@override
List<Object> get props => [];
}
class PopularesMoviesLoadedState extends HomeState{
final List<MovieEntity> popularesMovies;
PopularesMoviesLoadedState(this.popularesMovies);
@override
List<Object> get props => [popularesMovies];
}
class TopRatedMoviesLoadedState extends HomeState{
final List<MovieEntity> topRatedMovies;
TopRatedMoviesLoadedState(this.topRatedMovies);
@override
List<Object> get props => [topRatedMovies];
}
import 'package:get_it/get_it.dart';
import 'package:http/http.dart' as http;
import 'package:prueba_gbp/data/data_source/movies_remote_data_source.dart';
import 'package:prueba_gbp/data/data_source/movies_remote_data_source_impl.dart';
import 'package:prueba_gbp/data/repositories/movies_repository_impl.dart';
import 'package:prueba_gbp/domain/repositories/movies_repository.dart';
import 'package:prueba_gbp/domain/usecases/get_populares_movies.dart';
import 'package:prueba_gbp/domain/usecases/get_top_rated_movies.dart';
import 'package:prueba_gbp/presentation/blocs/home_bloc/home_cubit.dart';
final sl = GetIt.instance;
Future<void> init() async {
//Futures bloc
sl.registerFactory<HomeCubit>(() => HomeCubit(
getPopularesMoviesUseCase: sl.call(),
getTopRatedMoviesUseCase: sl.call()
));
//use cases
sl.registerLazySingleton<GetPopularesMoviesUseCase>(() => GetPopularesMoviesUseCase(repository: sl.call()));
sl.registerLazySingleton<GetTopRatedMoviesUseCase>(() => GetTopRatedMoviesUseCase(repository: sl.call()));
//repository
sl.registerLazySingleton<MoviesRepository>(() => MoviesRepositoryImpl(remoteDataSource: sl.call()));
//remote data
sl.registerLazySingleton<MoviesRemoteDataSource>(() => MoviesRemoteDataSourceImpl(client: sl.call()));
//external
sl.registerLazySingleton(() => http.Client());
}
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Scaffold(
backgroundColor: Colors.blue[200],
body: SingleChildScrollView(
child: _buildBody(size, context)
),
);
}
_buildBody(Size size, BuildContext context, ) {
return Column(
children: [
SizedBox(
height: size.height,
child: Stack(
children: [
Container(
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 20),
height: size.height*0.7,
width: double.infinity,
margin: EdgeInsets.only(top: size.height*0.3),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(24),
topRight: Radius.circular(24),
)
),
child: Column(
children: [
SizedBox(height: 10.0),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'POPULARES',
style: TextStyle(
fontWeight: FontWeight.bold
),
),
Text(
'See all'
),
],
),
SizedBox(height: 10.0),
BlocBuilder<HomeCubit, HomeState>(
builder: (_, currentState) {
if(currentState is MoviesLoadingState) {
return CircularProgressIndicator();
}
else if (currentState is PopularesMoviesLoadedState )
return MovieHorizontal(peliculas: currentState.popularesMovies);
else {
return CircularProgressIndicator();
}
}
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'TOP RATED',
style: TextStyle(
fontWeight: FontWeight.bold
),
),
Text(
'See all'
),
],
),
SizedBox(height: 10),
BlocBuilder<HomeCubit, HomeState>(
builder: (_, currentState){
if(currentState is MoviesLoadingState) {
return CircularProgressIndicator();
}
else if (currentState is TopRatedMoviesLoadedState )
return MovieHorizontal(peliculas: currentState.topRatedMovies);
else {
return CircularProgressIndicator();
}
}
)
],
),
),
Padding(
padding: const EdgeInsets.only(right: 23.0, left: 23.0, top: 80.0),
child: Column(
children: [
Text(
'Hello, what do you \nwant to watch?',
style: TextStyle(
color: Colors.white,
fontSize: 32,
fontWeight: FontWeight.bold
),
),
SizedBox(height: 10.0),
TextField(
style: TextStyle(color: Colors.white),
decoration: InputDecoration(
contentPadding: EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0),
prefixIcon: Icon(Icons.search),
hintText: "Search",
border: OutlineInputBorder(
borderSide: BorderSide(color: Colors.white, width: 32.0),
borderRadius: BorderRadius.circular(25.0)
),
)
)
],
),
)
],
)
)
],
);
}
}