标签: flutter-bloc

针对特定用例在 flutter 中的不同页面上维护相同的状态

我知道颤振中的状态管理存在某些问题,但它们似乎都不能解决我的用例。

最近我正在构建一个基于电子商务的应用程序,并遇到了这种对状态管理的真正需求。我有2页,

  1. 其中一个是产品页面,我在其中将产品添加到购物车。
  2. 第二个是购物车页面,我在其中看到最近添加到购物车的产品。

产品和购物车页面

用户可以将产品添加到购物车,然后导航到购物车。在购物车页面中,他们还可以增加或减少商品的数量。

正如您所看到的,最初黄色商品被添加到购物车中,数量为 3,但在购物车页面中,用户按下 (-) 按钮,将数量减少到 1。现在,如果用户按下后退按钮,则状态为黄色产品在产品页面上仍为 3。与粉色产品类似的情况。

因此,我尝试使用正常的 setState 和一些全局数据结构来解决这个问题来跟踪数量。但随着我的应用程序变得越来越大,跨页面维护状态真的很困难。我读过不同的状态管理解决方案,例如 redux、BloC 模式、Provider,...但我不清楚如何在我的用例中使用它们。有没有有经验的人帮我把石头敲碎,帮我消化一下?

任何有关如何解决此问题的示例代码和解释将不胜感激!

希望我的问题是清楚的!

state-management flutter flutter-provider flutter-bloc flutter-state

5
推荐指数
1
解决办法
1973
查看次数

如何在颤振块图案中的一肘中添加多个状态?

我正在 flutter 中开发一个应用程序,它执行基于 OTP 的身份验证来登录。之前我正在管理类本身的状态,以便我可以使用 setState 方法来相应地呈现 UI。然后我改成 flutter_bloc cubit 模式来管理状态。但我不明白如何才能在一肘内记录多个状态。

考虑以下 State 和 Cubit 代码,


**State**.

@immutable
abstract class LoginState {}

class LoginInitial extends LoginState {
  final Map loginState;
  LoginInitial({this.loginState});
}

**Cubit**
class LoginCubit extends Cubit<LoginState> {
  Map loginState = {
    "isPhoneSubmitted": false,
    "isOtpArrived": false,
  };
  LoginCubit()
      : super(
          LoginInitial(
            loginState: {
              "isPhoneSubmitted": false,
              "isOtpArrived": false,
            },
          ),
        );

  void sendOtp() {
    emit(
      LoginInitial(
        loginState: {
          "isPhoneSubmitted": true,
          "isOtpArrived": false,
        },
      ),
    );
    Future.delayed(Duration(seconds: 4), () {
      emit(
        LoginInitial( …
Run Code Online (Sandbox Code Playgroud)

dart flutter flutter-bloc cubit

5
推荐指数
1
解决办法
1万
查看次数

使用块颤动从屏幕 B 导航回来时如何更新屏幕 A

我有一个屏幕(A),它使用“AccountFetched”状态从数据库加载数据列表:

return BlocProvider<AccountBloc>(
      create: (context) {
        return _accountBloc..add(FetchAccountEvent());
      },
      child: BlocBuilder<AccountBloc, AccountState>(
        builder: (context, state) {
          if (state is AccountFetched) {
            accounts = state.accounts;
          }
Run Code Online (Sandbox Code Playgroud)

在我的第二个屏幕 (B) 中,我调用 AddAccountEvent 将数据添加到数据库并导航回父屏幕屏幕 (A)。

onPressed: () {
   BlocProvider.of<AccountBloc>(context)
     ..add(AddAccountEvent(account: account));
   Navigator.of(context).pop();
}
Run Code Online (Sandbox Code Playgroud)

但是当我导航回屏幕 A 时,数据列表并未更新。我应该手动刷新屏幕(A)还是如何更新块的状态?

这是我的集体课程:

class AccountBloc extends Bloc<AccountEvent, AccountState> {
  AccountBloc() : super(AccountInitial());

  @override
  Stream<AccountState> mapEventToState(AccountEvent event) async* {
    if (event is FetchAccountEvent) yield* _fetchAccountEvent(event, state);
    if (event is AddAccountEvent) yield* _addAccountEvent(event, state);
  }

  Stream<AccountState> _fetchAccountEvent(
      FetchAccountEvent event, AccountState state) async* …
Run Code Online (Sandbox Code Playgroud)

flutter bloc flutter-navigation flutter-bloc

5
推荐指数
1
解决办法
3885
查看次数

定期计时器内的“事件处理程序正常完成后调用发出”问题

我使用 Flutter 和 flutter_bloc 制作一个应用程序,它定期向我的服务器发送 API 请求并请求数据。在我使用计时器实现周期性功能之前,它最初工作得很好,这是我的块文件:

class HomeBeehivesBloc extends Bloc<HomeBeehivesEvent, HomeBeehivesState> {
  HomeBeehivesBloc() : super(BeehivesInitial()) {
    on<LoadBeehives>((event, emit) => _onBeehivesLoaded(emit));
  }

  Future<void> _onBeehivesLoaded(Emitter<HomeBeehivesState> emit) async {
    emit(BeehivesLoading());

    final repository = BeehivesRepository();

    const duration = Duration(seconds: 5);
    Timer.periodic(duration, (timer) async {
      try {
        await repository.getHomeBeehives().then((beehives) async {
          emit(BeehivesLoadedSuccessfully(beehives: beehives));
        });
      } catch (exception) {
        log(exception.toString());
      }
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

但我得到了这个例外:

'package:bloc/src/emitter.dart': Failed assertion: line 114 pos 7: '!_isCompleted': 

      emit was called after an event handler completed normally.
      This is usually …
Run Code Online (Sandbox Code Playgroud)

flutter flutter-bloc

5
推荐指数
1
解决办法
3835
查看次数

Flutter 群聊发送消息后不刷新

我是 bloc 的新手,正在尝试使用包实现聊天flutter_bloc。我的消息传递服务是 twilio Conversations api。我的功能运行得很好,我只是无法刷新我的消息列表。有人可以告诉我我在这里缺少什么吗?如果我访问聊天页面,我可以看到所有消息,只有当我们有新消息时它才不会刷新。

\n

由于取得了小小的成功,我更新了我的代码。每当用户 A 或用户 B 加入聊天时,都会显示所有消息。如果我以用户 A 的身份发送消息,则该消息现在将在用户 A 的 UI 中可见,并且它是对话的一部分,但用户 B 在不重新加载的情况下不会收到添加到对话中的新消息。这里缺少哪个步骤以便其他用户也收到消息?我只需要帮助转换我的代码,以便我有一个流,聊天的其他参与者可以收听,这样他们的对话也令人耳目一新。

\n

我的 chat_event.dart

\n
  abstract class ChatEvent extends Equatable{\n  const ChatEvent();\n\n  @override\n  List<Object> get props => [];\n}\n\nclass InitialChatEvent extends ChatEvent {}\n\nclass AddMessage extends ChatEvent {\n  final String messageToPost;\n\n  AddMessage(this.messageToPost);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我的 chat_state.dart

\n
   class ChatState extends Equatable {\n  final Messages messages;\n\n  const ChatState({required this.messages});\n\n  factory ChatState.initial() =>  ChatState(messages: Messages(messages: []));\n\n  @override\n  List<Object> get props => [messages];\n\n  @override\n …
Run Code Online (Sandbox Code Playgroud)

flutter bloc flutter-bloc twilio-conversations flutter-streambuilder

5
推荐指数
1
解决办法
2215
查看次数

flutter:由于不支持的操作而无法修改列表:无法修改不可修改的列表

我正在尝试修改列表中的项目值,这总是会导致Can't modify list because of Unsupported operation: Cannot modify an unmodifiable list

我正在使用块状态管理和冻结作为代码生成器。这是我的代码:

从服务器获取角色并将列表添加到角色

Future<RoleWithNeeds> getRoleWithNeeds({
    required RoleWithNeeds selectedRoles,
  }) async {
    final dataFromApi = await _apiClient.fetchNeedsByRoles(selectedRoles.idRole);

    final needsApi = dataFromApi.data;
    final needsRepository = <Need>[];

    // convert to a repository model
    for (var i = 0; i < needsApi.length; i++) {
      needsRepository.add(Need(
        id: needsApi[i].id,
        name: needsApi[i].name,
        createdAt: needsApi[i].createdAt,
      ));
    }

    return selectedRoles.copyWith(needs: needsRepository);
  }
Run Code Online (Sandbox Code Playgroud)

当我尝试修改 RoleWithNeeds 中的嵌套数组时的部分

FutureOr<void> _onClickNeed(_ClickNeed event, Emitter<NeedState> emit) {
    emit(_Load());

    try {
      for (var role …
Run Code Online (Sandbox Code Playgroud)

flutter flutter-bloc flutter-freezed

5
推荐指数
0
解决办法
3887
查看次数

当我们已经有了 Flutter 内置的 setState 时,为什么还要在 Flutter 中使用 BloC 或 Provider 呢?

也许我不明白 BloC 或 Provider 的目的,但我很困惑为什么我们想要使用它们而不是使用 Flutter 的内置状态管理(使用 widget)Stateful。我刚刚完成了一个应用程序,但不记得我希望我需要比默认值更多的东西。有人可以帮我解决问题吗?

flutter flutter-provider flutter-bloc flutter-state

5
推荐指数
1
解决办法
4436
查看次数

使用不包含 Bloc&lt;dynamic,dynamic&gt; 类型的 Bloc 的上下文调用 BlocProvider.of()

\n

错误:I / flutter(5919):\ xe2 \ x95 \ x90 \ xe2 \ x95 \ x90 \ xe2 \ x95 \ xa1小部件库捕获异常\ n \ xe2 \ x95 \ x9e \ xe2 \ x95 \ x90 \ xe2 \ x95 \x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90 \xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2 \x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95 \x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90 \xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2 \x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95 \x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90 I/颤动\n ( 5919): 构建 Builder 时抛出以下断言:\n I/flutter (5919): 使用不包含 Bloc 类型的 Bloc 的上下文调用 BlocProvider.of()。I/flutter ( 5919):从传递给 I/flutter ( 5919) 的上下文开始找不到祖先:\n BlocProvider.of>()。I/flutter ( 5919):
\n 如果您使用的上下文来自 BlocProvider 之上的小部件,则可能会发生这种情况。I/flutter(5919):使用的上下文是:\n BlocBuilder,动态>(脏,状态:I/flutter(\n 5919):_BlocBuilderBaseState,\n动态>#55a7d(生命周期状态:已创建))I/flutter ( 5919): 相关的导致错误的小部件是: I/flutter ( 5919): …

flutter bloc flutter-bloc

4
推荐指数
1
解决办法
4209
查看次数

嵌套 BlocBuilders 以管理同一小部件​​上的多个状态

我想将文本 Update BlocBuilder 嵌套在另一个 BlocBuilder 中,该 BlocBuilder 通过滑块小部件控制其字体大小。但是,我无法让它工作。请帮忙!

BlocBuilder<SettingsBloc, SettingsState>(
            builder: (context, state) {
       return BlocBuilder<TextFieldBloc, TextFieldState>(
        builder: (context, state) {
          if (state is TextFieldInitState) {
            return Text(
                state.text.toString(),
              style: TextStyle(
                fontSize: state.fontSize,
                fontFamily: 'EthiopicWookianos',
                fontWeight: FontWeight.normal,
                color: Colors.blueGrey,
              ),
            );
          } else if (state is TextFieldLaterState) {
            return Text(
              state.text.toString(),
              style: TextStyle(
                fontSize: state.fontSize,
                fontFamily: 'EthiopicWookianos',
                fontWeight: FontWeight.normal,
                color: Colors.blueGrey,
              ),
            );
          } else {
            return Text("something wrong");
          }
});
}),
Run Code Online (Sandbox Code Playgroud)

这是 TextField Bloc 的代码...(当然它们在单独的文件中)。

import 'package:flutter/widgets.dart';

abstract class …
Run Code Online (Sandbox Code Playgroud)

flutter bloc flutter-bloc

4
推荐指数
1
解决办法
3357
查看次数

我需要处理 cubit 实例吗?

我是颤振和块的新手。事实上,我最近才开始使用 cubit。出于学习目的,我创建了一个简单的应用程序,在其中使用 cubit 来实现 bloc 功能。在我在网上找到的所有示例中,他们建议在 UI 中处理 bloc 实例。但是,当涉及到肘时,我没有找到类似的东西。所以,我的问题是:我是否需要处理 cubit 实例以及如何处理?这里值得一提的是,我正在使用 MultiBlocProvider。

flutter flutter-bloc

4
推荐指数
1
解决办法
1000
查看次数