flutter- 我可以在应用树中实现 BlocProvider 而不是在 runApp 中实现吗?
flutter- Can I implemment BlocProvider in the app tree instead of implemmented in runApp?
我在应用程序中工作,不使用 bloc 作为状态管理,我想添加更多功能(该功能将使用 bloc),当我尝试 运行 App I收到此错误:
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY
╞═══════════════════════════════════════════════════════════ I/flutter
(17157): The following TransportLoading object was thrown building
TransportPage(dirty, state: I/flutter (17157):
_TransportPageState#daf04): I/flutter (17157): Instance of 'TransportLoading'
TransportLoading 是集团中的一个州。
这是 TransportBloc
class TransportBloc extends Bloc<TransportEvent, TransportState> {
final StudentCircuitRepository studentCircuitRepository ;
TransportBloc({this.studentCircuitRepository}) ;
@override
TransportState get initialState => throw TransportLoading();
@override
Stream<TransportState> mapEventToState (
TransportEvent event,
) async* {
// TODO: implement mapEventToState
List<StudentCircuitModel> student ;
try{
if(event is LoadingStudentCircuit){
student = await studentCircuitRepository.fetchStudentCircuit(event.studentList);
}
if(student.length == 0){
yield TransportEmpty();
}else{
yield TransportLoaded(studentCircuit: student);
}
}catch (_) {
yield TransportError();
}
}
}
这是我尝试使用 TransportBloc 的页面
class TransportPageBloc extends StatefulWidget {
final List<StudentUser> stdUser;
TransportPageBloc(this.stdUser);
@override
_TransportBloxState createState() => _TransportBloxState();
}
class _TransportBloxState extends State<TransportPageBloc> {
@override
Widget build(BuildContext context) {
return BlocProvider<TransportBloc>(
create: (BuildContext context) => TransportBloc(),
child: TransportPage(widget.stdUser),
);
}
}
class TransportPage extends StatefulWidget {
final List<StudentUser> student;
TransportPage(this.student);
@override
_TransportPageState createState() => _TransportPageState();
}
class _TransportPageState extends State<TransportPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Liste des étudiants'),
),
body:
BlocBuilder<TransportBloc, TransportState>(bloc: TransportBloc(),builder: (context, state) {
if (state is TransportLoading) {
BlocProvider.of<TransportBloc>(context).add(LoadingStudentCircuit(studentList: widget.student));
return _initialWidget();
} else if (state is TransportLoaded) {
return _listStudentCircuit(state.studentCircuit);
} else if (state is TransportEmpty) {
return _emptyTransport();
} else if (state is TransportError) {
return _errorWidget();
}
return null;
}),
);
}
}
Widget _initialWidget() {
return Center(
child: CircularProgressIndicator(),
);
}
Widget _listStudentCircuit(List<StudentCircuitModel> studentCircuit) {
return ListView.separated(
itemBuilder: (context, index) {
return Container(
child: Text(studentCircuit[index].eleve.name),
);
},
separatorBuilder: (context, index) {
return Divider(
height: 5.0,
);
},
itemCount: studentCircuit.length);
}
Widget _emptyTransport(){
return Center(
child: Text('Verifier que vous avez des enfant'),
);
}
Widget _errorWidget(){
return Center(
child: Text('this is the error page'),
);
}
您正在使用 throw
设置您的初始状态,这不是 throw
的用途。
替换这个
@override
TransportState get initialState => throw TransportLoading();
有了这个,在你的TransportBloc
TransportPageBloc() : super(TransportLoading());
我在应用程序中工作,不使用 bloc 作为状态管理,我想添加更多功能(该功能将使用 bloc),当我尝试 运行 App I收到此错误:
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ I/flutter (17157): The following TransportLoading object was thrown building TransportPage(dirty, state: I/flutter (17157): _TransportPageState#daf04): I/flutter (17157): Instance of 'TransportLoading'
TransportLoading 是集团中的一个州。
这是 TransportBloc
class TransportBloc extends Bloc<TransportEvent, TransportState> {
final StudentCircuitRepository studentCircuitRepository ;
TransportBloc({this.studentCircuitRepository}) ;
@override
TransportState get initialState => throw TransportLoading();
@override
Stream<TransportState> mapEventToState (
TransportEvent event,
) async* {
// TODO: implement mapEventToState
List<StudentCircuitModel> student ;
try{
if(event is LoadingStudentCircuit){
student = await studentCircuitRepository.fetchStudentCircuit(event.studentList);
}
if(student.length == 0){
yield TransportEmpty();
}else{
yield TransportLoaded(studentCircuit: student);
}
}catch (_) {
yield TransportError();
}
}
}
这是我尝试使用 TransportBloc 的页面
class TransportPageBloc extends StatefulWidget {
final List<StudentUser> stdUser;
TransportPageBloc(this.stdUser);
@override
_TransportBloxState createState() => _TransportBloxState();
}
class _TransportBloxState extends State<TransportPageBloc> {
@override
Widget build(BuildContext context) {
return BlocProvider<TransportBloc>(
create: (BuildContext context) => TransportBloc(),
child: TransportPage(widget.stdUser),
);
}
}
class TransportPage extends StatefulWidget {
final List<StudentUser> student;
TransportPage(this.student);
@override
_TransportPageState createState() => _TransportPageState();
}
class _TransportPageState extends State<TransportPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Liste des étudiants'),
),
body:
BlocBuilder<TransportBloc, TransportState>(bloc: TransportBloc(),builder: (context, state) {
if (state is TransportLoading) {
BlocProvider.of<TransportBloc>(context).add(LoadingStudentCircuit(studentList: widget.student));
return _initialWidget();
} else if (state is TransportLoaded) {
return _listStudentCircuit(state.studentCircuit);
} else if (state is TransportEmpty) {
return _emptyTransport();
} else if (state is TransportError) {
return _errorWidget();
}
return null;
}),
);
}
}
Widget _initialWidget() {
return Center(
child: CircularProgressIndicator(),
);
}
Widget _listStudentCircuit(List<StudentCircuitModel> studentCircuit) {
return ListView.separated(
itemBuilder: (context, index) {
return Container(
child: Text(studentCircuit[index].eleve.name),
);
},
separatorBuilder: (context, index) {
return Divider(
height: 5.0,
);
},
itemCount: studentCircuit.length);
}
Widget _emptyTransport(){
return Center(
child: Text('Verifier que vous avez des enfant'),
);
}
Widget _errorWidget(){
return Center(
child: Text('this is the error page'),
);
}
您正在使用 throw
设置您的初始状态,这不是 throw
的用途。
替换这个
@override
TransportState get initialState => throw TransportLoading();
有了这个,在你的TransportBloc
TransportPageBloc() : super(TransportLoading());