dart 如何在扑动中延长BLoC?

dauxcl2d  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(114)

我对 dart 和扑翼还比较陌生。我想创建一个基本块,它可以由另一个扩展,以继承和/或覆盖基本块中定义的事件,并提供自己的事件。让一个块扩展另一个块似乎很好,直到我尝试在BlocBuilder中使用扩展块。在我的示例中,基本块称为BlocABloc,子块称为BlocBBloc
我得到一个错误,它说:
“BlocBBloc”不符合类型参数“B”的绑定“StateStreamable”。尝试使用是或'StateStreamable'的子类的类型
如果扩展区块不被禁止,我可能会错过什么,导致这不工作?谢谢。我的消息来源在下面。

A源块

  1. import 'package:equatable/equatable.dart';
  2. import 'package:flutter_bloc/flutter_bloc.dart';
  3. class BlocABloc extends Bloc<BlocAEvent, BlocAState> {
  4. BlocABloc(BlocAInitial blocAInitial) : super(const BlocAInitial(count: 0)) {
  5. on<Increment>((event, emit) {
  6. emit(BlocAState(count: state.count + 1));
  7. });
  8. }
  9. }
  10. class BlocAState extends Equatable {
  11. const BlocAState({required this.count});
  12. final int count;
  13. @override
  14. List<Object> get props => [count];
  15. }
  16. final class BlocAInitial extends BlocAState {
  17. const BlocAInitial({required super.count});
  18. }
  19. class BlocAEvent extends Equatable {
  20. const BlocAEvent();
  21. @override
  22. List<Object> get props => [];
  23. }
  24. final class Increment extends BlocAEvent {}

B组来源

  1. import '../bloc_a/bloc_a_bloc.dart';
  2. class BlocBBloc extends BlocABloc {
  3. BlocBBloc() : super(const BlocAInitial(count: 0)) {
  4. on<BlocBEvent>((event, emit) {
  5. // TODO: implement event handler
  6. });
  7. }
  8. }
  9. sealed class BlocBState extends BlocAState {
  10. const BlocBState({required super.count});
  11. @override
  12. List<Object> get props => [];
  13. }
  14. final class BlocBInitial extends BlocBState {
  15. const BlocBInitial({required super.count});
  16. }
  17. sealed class BlocBEvent extends BlocAEvent {
  18. const BlocBEvent();
  19. @override
  20. List<Object> get props => [];
  21. }

主要

  1. import 'package:bloc_extended/bloc_a/bloc_a_bloc.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_bloc/flutter_bloc.dart';
  4. import 'bloc_b/bloc_b_bloc.dart';
  5. void main() {
  6. runApp(const MyApp());
  7. }
  8. class MyApp extends StatelessWidget {
  9. const MyApp({super.key});
  10. @override
  11. Widget build(BuildContext context) {
  12. return MaterialApp(
  13. theme: ThemeData(
  14. colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
  15. useMaterial3: true,
  16. ),
  17. home: const _Home(key: Key('home')),
  18. );
  19. }
  20. }
  21. class _Home extends StatelessWidget {
  22. const _Home({super.key});
  23. @override
  24. Widget build(BuildContext context) {
  25. return Scaffold(
  26. appBar: AppBar(title: const Text('BLoC')),
  27. body: BlocProvider<BlocBBloc>(
  28. create: (_) => BlocBBloc(),
  29. child: BlocBuilder<BlocBBloc, BlocBState>( ///<------ ERROR HERE
  30. builder: (context, state) {
  31. return Column(
  32. children: [
  33. Center(child: Text('${state.count}')),
  34. FloatingActionButton(
  35. onPressed: () {
  36. context.read<BlocBBloc>().add(Increment());
  37. },
  38. child: const Icon(Icons.add),
  39. ),
  40. ],
  41. );
  42. },
  43. ),
  44. ),
  45. );
  46. }
  47. }
uidvcgyl

uidvcgyl1#

此错误发生是因为尝试使用BlocBState。由于BlocBBloc扩展了BlocABloc,因此它应该使用来自BlocABloc的状态。来自BlocABloc的州对BlocBState一无所知。你可以这样做

  1. abstract class BlocAState<T> extends Equatable {...}
  2. abstract class BlocABloc<Event, T> extends Bloc<Event, BlocAState<T> {..}

然后你可以像这样扩展这个块:

  1. sealed class BlocBState extends Equatable {..}
  2. class BlocBBloc extends BlocABloc<BlocBEvent, BlocBState>{..}

相关问题