Flutter Cubit 状态不离开起点(MyInitialState)

标签 flutter dart flutter-layout bloc state-management

我正在学习 cubit/bloc 但是当我有一个从 json 文件加载信息的页面时,我的状态不会改变。
我不知道发生了什么,因为它不会返回任何错误,但通过打印我可以遵循当前状态。
我也没有找到使用这种方式的信息来源,不需要点击什么的
我的肘

   class AgentesCubit extends Cubit<AgentesState> {
      final AgentesRepository _agentesRepository = JsonAgentesRepository();
      AgentesCubit() : super(AgentesInitial());
      List<Agentes> listAgentes;
    
      getAgentes() async {
        try {
          emit(AgentesLoading());
          _agentesRepository.loadAgentes().then((data) => listAgentes = data);
          print(listAgentes);
          emit(AgentesLoaded(listAgentes));
        } on NetworkError {
          emit(AgentesError('Ocorreu algo inesperado, tente novamente mais tarde'));
        }
      }
    }
    
    class NetworkError {}
我的州
part of 'agentes_cubit.dart';

@immutable
abstract class AgentesState {
  const AgentesState();
}

class AgentesInitial extends AgentesState {
  const AgentesInitial();
}

class AgentesLoading extends AgentesState {
  const AgentesLoading();
}

class AgentesLoaded extends AgentesState {
  final List<Agentes> agentes;
  const AgentesLoaded(this.agentes);

  @override
  bool operator ==(Object o) {
    if (identical(this, o)) return true;
    return o is AgentesLoaded && o.agentes == agentes;
  }

  @override
  int get hashCode => agentes.hashCode;
}

class AgentesError extends AgentesState {
  final String message;
  const AgentesError(this.message);

  @override
  bool operator ==(Object o) {
    if (identical(this, o)) return true;

    return o is AgentesError && o.message == message;
  }

  @override
  int get hashCode => message.hashCode;
}
我的页面
class AgentesPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
          child: BlocBuilder<AgentesCubit, AgentesState>(
        cubit: AgentesCubit(),
        builder: (context, state) {
          if (state is AgentesInitial) {
            print('initial');
            return buildLoading();
          } else if (state is AgentesLoading) {
            print('loading');
            return buildLoading();
          } else if (state is AgentesLoaded) {
            print('loaded');
            return buildAgentesList(state.agentes, context);
          }
          return Container();
        },
      )),
    );
  }

  buildLoading() {
    return Center(
      child: CircularProgressIndicator(),
    );
  }

  buildAgentesList(agentes, context) {
    print(agentes);
    return Container(
      width: MediaQuery.of(context).size.width,
      child: ListView.builder(
          itemCount: agentes.length,
          itemBuilder: (context, index) => CustomAgenteItem(agentes[index])),
    );
  }

  void loadAgentes(BuildContext context) {
    final agentesCubit = context.bloc<AgentesCubit>();
    agentesCubit.getAgentes();
  }
}
我的代理项目小部件
class CustomAgenteItem extends StatelessWidget {
  final Agentes agente;
  CustomAgenteItem(this.agente);

  @override
  Widget build(BuildContext context) {
    return InkWell(
        highlightColor: mainColor,
        splashColor: mainColor,
        onTap: () => print(''),
        child: Container(
          width: MediaQuery.of(context).size.width,
          child: new ParallaxImage(
            child: Padding(
              padding: const EdgeInsets.only(top: 16.0, left: 16),
              child: Text(
                agente.nome,
                style: listAgents,
              ),
            ),
            extent: 100.0,
            image: new AssetImage(
              'assets/images/bg.jpg',
            ),
          ),
        ));
  }
}
我的存储库
class AgentesRepository {
  loadAgentes() async {
    return agentesFromJson(
        await rootBundle.loadString('assets/infos/agentes.json'));
  }
}

最佳答案

看来您需要 await _agentesRepository.loadAgentes() 的结果因为是异步函数,否则代码块会继续运行下一行代码。您还可以将该行之后的所有代码移动到您传递给 .then 的函数中。但它也不会读。
而且看起来你不需要listAgentesAgentesCubit 上定义类(class)

...
var data = await _agentesRepository.loadAgentes();
emit(AgentesLoaded(data));
...

关于Flutter Cubit 状态不离开起点(MyInitialState),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63606441/

相关文章:

Firebase 电话身份验证在 Flutter 应用程序中不起作用,无论是在 iOS 模拟器还是在真实设备中

android-studio - 如何使用Android Studio生成的注释将dart文件保存在文件系统中?

flutter - 如何在抖动中获得Json的 map 长度

android - 在 Flutter ListView 中加载更多选项

flutter - 非事件InputConnection抖动上的getSelectedText

系统状态下的Flutter容器

flutter - 目前,该应用程序在 flutter 中无法使用 Facebook 登录

dart - 当我的键盘处于事件状态时,如何避免背景图像缩小?

firebase - flutter 和 Firebase : Send File as Image

flutter - 如何在Dart中检查字符串为null?