Flutter 如何在同一屏幕上正确使用具有两个事件的BLoC?

Flutter 如何在同一屏幕上正确使用具有两个事件的BLoC?,flutter,flutter-bloc,Flutter,Flutter Bloc,我正在尝试创建一个具有bloc和clean架构的电影应用程序,我想展示流行电影和顶级电影,但我只能展示其中一部。我在两个用例中使用相同的bloc 我做错了什么?我应该用两个集团吗 我将发布一些代码,但这里是完整的演示。提前谢谢 main.dart 导入“包装:颤振/材料.省道”; 进口“包装:颤振团/颤振团.飞镖”; 导入“包:prueba_gbp/演示文稿/blocs/home_bloc/home_cubit.dart”; 导入“包:prueba_gbp/presentation/screen

我正在尝试创建一个具有bloc和clean架构的电影应用程序,我想展示流行电影和顶级电影,但我只能展示其中一部。我在两个用例中使用相同的bloc

我做错了什么?我应该用两个集团吗

我将发布一些代码,但这里是完整的演示。提前谢谢

main.dart

导入“包装:颤振/材料.省道”;
进口“包装:颤振团/颤振团.飞镖”;
导入“包: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)
                      ),
                    )
                  )
                ],
              ),
            )
          ],
        )
      )
    ],
    );
  }
}