我对 dart 和扑翼还比较陌生。我想创建一个基本块,它可以由另一个扩展,以继承和/或覆盖基本块中定义的事件,并提供自己的事件。让一个块扩展另一个块似乎很好,直到我尝试在BlocBuilder中使用扩展块。在我的示例中,基本块称为BlocABloc
,子块称为BlocBBloc
。
我得到一个错误,它说:
“BlocBBloc”不符合类型参数“B”的绑定“StateStreamable”。尝试使用是或'StateStreamable'的子类的类型
如果扩展区块不被禁止,我可能会错过什么,导致这不工作?谢谢。我的消息来源在下面。
A源块
import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class BlocABloc extends Bloc<BlocAEvent, BlocAState> {
BlocABloc(BlocAInitial blocAInitial) : super(const BlocAInitial(count: 0)) {
on<Increment>((event, emit) {
emit(BlocAState(count: state.count + 1));
});
}
}
class BlocAState extends Equatable {
const BlocAState({required this.count});
final int count;
@override
List<Object> get props => [count];
}
final class BlocAInitial extends BlocAState {
const BlocAInitial({required super.count});
}
class BlocAEvent extends Equatable {
const BlocAEvent();
@override
List<Object> get props => [];
}
final class Increment extends BlocAEvent {}
B组来源
import '../bloc_a/bloc_a_bloc.dart';
class BlocBBloc extends BlocABloc {
BlocBBloc() : super(const BlocAInitial(count: 0)) {
on<BlocBEvent>((event, emit) {
// TODO: implement event handler
});
}
}
sealed class BlocBState extends BlocAState {
const BlocBState({required super.count});
@override
List<Object> get props => [];
}
final class BlocBInitial extends BlocBState {
const BlocBInitial({required super.count});
}
sealed class BlocBEvent extends BlocAEvent {
const BlocBEvent();
@override
List<Object> get props => [];
}
主要
import 'package:bloc_extended/bloc_a/bloc_a_bloc.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'bloc_b/bloc_b_bloc.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const _Home(key: Key('home')),
);
}
}
class _Home extends StatelessWidget {
const _Home({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('BLoC')),
body: BlocProvider<BlocBBloc>(
create: (_) => BlocBBloc(),
child: BlocBuilder<BlocBBloc, BlocBState>( ///<------ ERROR HERE
builder: (context, state) {
return Column(
children: [
Center(child: Text('${state.count}')),
FloatingActionButton(
onPressed: () {
context.read<BlocBBloc>().add(Increment());
},
child: const Icon(Icons.add),
),
],
);
},
),
),
);
}
}
1条答案
按热度按时间uidvcgyl1#
此错误发生是因为尝试使用BlocBState。由于BlocBBloc扩展了BlocABloc,因此它应该使用来自BlocABloc的状态。来自BlocABloc的州对BlocBState一无所知。你可以这样做
然后你可以像这样扩展这个块: