flutter_bloc中notifylistners()的替代方法是什么?

hgc7kmma  于 2023-06-24  发布在  Flutter
关注(0)|答案(2)|浏览(151)

我是flutter_bloc的新手,需要一些清晰度。
我正在开发一个类似于TikTok的应用程序,它有一个PageViewVideoPlayer s。我想切换屏幕上的LikeSaveFollow按钮。父部件已经 Package 在FeedBlocBlocBuilder中,那么在不使用StatefulWidgets的情况下,我应该如何处理更新部件?
Provider中,我们只需要在任何需要的地方使用SelectorConsumer小部件,然后调用notifyListerners()。在flutter_bloc中,notifyListeners()的替代方案是什么?
我只想在变量值改变而state保持不变时更新小部件。

eqoofvh9

eqoofvh91#

你也可以使用emit。只要确保状态是可比较的。因此,可以使用equals和hashcode区分相同状态的两个版本。

pdkcd3nj

pdkcd3nj2#

当你在provider中使用notifyListeners()时,基本上,这意味着你想根据不同的状态更新这个值,但是bloc是在流上工作的,你需要发出状态,比如如果你的应用处于初始状态,那么你发出你的初始widget,在加载状态,你可以通过bloc发出你的加载状态。
但如果你想知道是否有类似的相关消费者那么答案是肯定的。Bloc Builder是一个基于不同事件重建小部件的小部件。
bloc.dart

import 'package:flutter_bloc/flutter_bloc.dart';

abstract class TextFormEvent {}

class ChangeImageOnTextForm extends TextFormEvent {}

class LoadingImageEvent extends TextFormEvent {}

abstract class ImageState {
  int get number => 0;
}

class FetchingState extends ImageState {}

class FetchedState extends ImageState {
  @override
  int number;
  FetchedState(this.number);
}

class BLocExample extends Bloc<TextFormEvent, ImageState> {
  BLocExample() : super(FetchingState()) {
    on<LoadingImageEvent>((event, emit) {
      emit(FetchingState());
    });
    on<ChangeImageOnTextForm>((event, emit) {
      emit(FetchedState(state.number));
    });
  }
}
// From UI Side

BlocBuilder<BLocExample, ImageState>(
              builder: (context, state) {
                print(state);
                if (state is FetchingState) {
                  return const CircularProgressIndicator();
                } else if (state is FetchedState) {
                  print(state.number);
                  return SizedBox(
                    height: 200,
                    width: 500,
                    child: Image.network(
                      frameBuilder:
                          (context, image, frame, wasSynchronouslyLoaded) {
                        if (frame == null) {
                          return const LinearProgressIndicator();
                        } else {
                          return image;
                        }
                      },
                      'https://source.unsplash.com/random?sig=${state.number}',
                    ),
                  );
                }

从上面的示例代码中,您可以理解块是如何基于不同的状态和事件工作的。

相关问题