【问题标题】:flutter- Can I implemment BlocProvider in the app tree instead of implemmented in runApp?flutter-我可以在应用程序树中实现 BlocProvider 而不是在 runApp 中实现吗?
【发布时间】:2021-05-26 16:43:03
【问题描述】:

我正在使用不使用 bloc 作为状态管理的应用程序,并且我想添加更多功能(该功能将使用 bloc),当我尝试运行应用程序时出现此错误:

══╡ 小部件库发现异常 ╞═════════════════════════════════════════════════ ══════════ I/颤振 (17157):以下 TransportLoading 对象被抛出构建 TransportPage(脏,状态:I/flutter(17157): _TransportPageState#daf04): I/flutter (17157): 'TransportLoading' 的实例

TransportLoading 是集团中的一种状态。

这是运输集团

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'),
  );
}

【问题讨论】:

  • 可以分享代码吗?
  • 我更新了我的问题
  • 您正在抛出异常并且想知道为什么会出现异常?

标签: flutter dart flutter-bloc


【解决方案1】:

您正在使用throw 设置您的初始状态,而这不是throw 的用途。

替换这个

 @override
  TransportState get initialState => throw TransportLoading();

有了这个,在你的TransportBloc

TransportPageBloc() :  super(TransportLoading());

【讨论】:

  • 好吧,如果你更新了你的 Bloc 包,那get initialState 会覆盖won't exist 仅供参考。您需要使用super()
  • 我会试试的,我现在面临另一个问题,现在状态不会随着 yeilded 状态而改变
  • 您可以尝试将前 2 个 yield 语句放入您的第一个 if(event is LoadingStudentCircuit) 代码块中。
猜你喜欢
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 2022-01-19
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多