我正在try 学习阻塞模式,我第一次遇到这种模式是在下面的git资源库fitness中,我试着使用我自己的代码,但它有很多错误和问题,所以我想我最好先试一试他们的代码,然后我会看到变化,所以我试了一下,但他们的代码也导致了错误.

我解决了其中的一些问题,但与块相关的问题仍然存在,您可以参考我为他们打开的这个问题PageSwipe/Change Issue,其中我解释了错误以及它们在代码中的来源.

我试着跟随位于这里migration guide的迁徙指南,但到目前为止还没有成功.

阻止代码可以在这里找到first page BloC code

如果为了解决这一问题还需要任何其他相关的东西 有问题, comments 一下,我会加进go 的

错误:

Bad state: add(PageSwipedEvent) was called without a registered event handler.
Make sure to register a handler via on<PageSwipedEvent>((event, emit) {...})

代码中导致该错误代码行:

bloc.add(PageChangedEvent());
// or
bloc.add(PageSwipedEvent(index: index));

阻止代码:

import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:flutter/material.dart';
import 'package:meta/meta.dart';

part 'onboarding_event.dart';
part 'onboarding_state.dart';

class OnboardingBloc extends Bloc<OnboardingEvent, OnboardingState> {
  OnboardingBloc() : super(OnboardingInitial());

  int pageIndex = 0;

  final pageController = PageController(initialPage: 0);

  @override
  Stream<OnboardingState> mapEventToState(
    OnboardingEvent event,
  ) async* {
    if (event is PageChangedEvent) {
      if (pageIndex == 2) {
        yield NextScreenState();
        return;
      }
      pageIndex += 1;

      pageController.animateToPage(
        pageIndex,
        duration: Duration(milliseconds: 500),
        curve: Curves.ease,
      );

      yield PageChangedState(counter: pageIndex);
    } else if (event is PageSwipedEvent) {
      pageIndex = event.index;
      yield PageChangedState(counter: pageIndex);
    }
  }
}

我还试着添加了以下内容:

on<PageSwipedEvent>((event, emit) => mapEventToState(event));

但它似乎不起作用(它不再显示问题,但它也没有完成工作.

编辑:

Flutter 翼版本:

Flutter version

推荐答案

你在on<PageSwipedEvent>((event, emit) => mapEventToState(event));的道路上是正确的.问题是您在一段代码中混合了块的几个不同版本.mapEventToState()方法使用yield而不是on<Event>((event, emit) => emit(State)).在模块8.0.0中对此进行了更改.https://pub.dev/packages/flutter_bloc/changelog.既然您说添加on<PageChangedEvent>((event, emit) => mapEventToState(event));修复了错误,即使代码仍然没有产生结果,我认为您使用的是8.0.0或更高版本.

try 将yield切换为on<Event>((event, emit) => emit(State)),并在构造函数中移动ON处理程序:

class OnboardingBloc extends Bloc<OnboardingEvent, OnboardingState> {

  int pageIndex = 0;
  final pageController = PageController(initialPage: 0);

  OnboardingBloc() : super(OnboardingInitial()){

    on<PageChangedEvent>((event, emit) async {
    
        if (pageIndex == 2) {
            emit(NextScreenState());
            return;
          }
          pageIndex += 1;
        
          pageController.animateToPage(
            pageIndex,
            duration: Duration(milliseconds: 500),
            curve: Curves.ease,
          );
        emit(PageChangedState(counter: pageIndex));
    
    });

    on<PageSwipedEvent>((event, emit) async {
       pageIndex = event.index;
       emit(PageChangedState(counter: pageIndex));
    });

}

Flutter相关问答推荐

我如何才能动态地将小部件排成一排进行排列呢?

如何在2024年使用Ffltter将用户数据保存在云FireStore中?

无法在我的Flutter 应用程序中使用GoRouter测试导航

如何从DART中的事件列表中获取即将到来的日期

为什么我的页面控制器在使用Riverpod时没有更改我的页面视图?

如何在抖动中将PNG图像转换为WebP

为什么我的Flutter 动画过渡没有发生?

显示图像的放大部分

如何在Flutter中的textField中在可编辑文本和前缀图标之间添加空格?

Flutter firebase_auth 和 firebase_core 依赖错误

从所有设备注销,因为用户帐户已从 firebase flutter 中删除

减少 Flutter 中 API 的连接等待时间

如何删除图像边框半径与其父容器边框半径之间的空白

对话框打开时如何使背景模糊?

如何将金钱格式化为数以百万计的Flutter 动?

如何在 Flutter 中使用简写 IF 禁用单选按钮?

如何制作两个显示相关内容且可编辑的文本字段?

参数类型MaterialPageRoute不能分配给参数类型String

Flutter GetX:Get.put 在 Widget 中的什么位置?

"!" 是什么意思该运算符在使用如下方式时意味着dart ?