在 bloc 中重置值事件和状态

Reset values event and state in the bloc flutter

我单独给事件赋值,但其他变量的值在事件中被重置。我为国家做了同样的事情。我用两个变量定义了一个状态,我在不同的地方通过 copyWith 赋予了这些值但是每次发送离子时,状态值 return 到它们的原始状态。 块中的状态和事件是否在每次更改其值时重置????

主要


import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:test1/bloc/datatest_bloc.dart';
import 'package:test1/bloc/datatest_state.dart';
import 'package:test1/bloc/datatest_event.dart';

import 'bloc/datatest_bloc.dart';

main() {
  runApp(MaterialApp(
    home: BlocProvider<Databloc>(
      create: (context) => Databloc(),
      child: Home(),
    ),
  ));
}

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: BlocBuilder<Databloc, DatatestState>(
        builder: (context, state) {
          return Center(
            child: Column(
              children: [
                ElevatedButton(
                  onPressed: () {
                    BlocProvider.of<Databloc>(context)
                        .add(DataEvent_name().copyWith(name: 'mohammd'));
                  },
                  child: Text('btn'),
                ),
                 ElevatedButton(
                  onPressed: () {
                    BlocProvider.of<Databloc>(context)
                        .add(DataEvent_name().copyWith(pass: 'passsss'));
                  },
                  child: Text('pass'),
                ),
              ],
            ),
          );
        },
      ),
    );
  }
}

事件集团

  
}

class DataEvent_name extends DatatestEvent {
  final String name;
  final String pass;
  DataEvent_name({ this.name='',  this.pass=''});

  DataEvent_name copyWith({String? name, String? pass}) {
    return DataEvent_name(name: name ?? this.name, pass: pass ?? this.pass);
  }
}

class DataEvent_pass extends DatatestEvent {}

class DataEvent_print extends DatatestEvent {}

状态-class

class DatatestState {

final String name;
  final String pass;
  DatatestState({
     this.name ='',
     this.pass='',
  });
 

  DatatestState copyWith({
    String? name,
    String? pass,
  }) {
    return DatatestState(
      name: name ?? this.name,
      pass: pass ?? this.pass,
    );
  }
}

集团-class

class Databloc extends Bloc<DatatestEvent, DatatestState> {
  Databloc() : super(DatatestState());

  final servisApi = ServisApi();

  @override
  Stream<DatatestState> mapEventToState(DatatestEvent event) async* {
    if (event is DataEvent_name) {
      yield DatatestState(name: event.name, pass: event.pass);
      servisApi.PrintState(a: state.name, b: state.pass);
    }
    
  }
}

产量

flutter: a:mohammd  b:
flutter: a:  b:passsss
flutter: a:mohammd  b:
flutter: a:  b:passsss
flutter: a:mohammd  b:
flutter: a:  b:passsss

BLoC 设计模式有助于将表示层与业务逻辑分离。

Events 是 Bloc 的输入。它们通常是 UI 事件,例如按下按钮。事件被分派然后转换为状态。

States 是 Bloc 的输出。表示组件可以侦听状态流并根据给定状态重绘自己的部分。

Transitions 在调用 mapEventToState 之后但在 Bloc 状态之前调度事件时发生已经更新。 Transition 由 currentState、调度的事件和 nextState 组成。

以您显示的示例为例,您在 UI 中有 2 个按钮:

  1. btn:您正在通过仅将 Name 参数传递为“mohammd”来触发事件 DataEvent_name。因此,最终状态的值为 name:'mohammd' 和 pass:''。 由于您正在打印当前状态值,因此输出为: a:mohammd b:

  2. pass:您正在触发一个事件 DataEvent_name,只传递 pass 参数作为“passsss”。因此,最终状态的值是 name: '' and pass:'passsss'。由于您正在打印当前状态值,因此输出为: a: b:passsss

Are the states and event in the block reset in each change of its values

事件只是输入。它是来自 UI 的数据载体,因此在执行业务逻辑时所需的数据可用。 由于状态是一个事件的输出,在整个 BLoC 中它一次只能有一个状态。因此,是的,它将更新较早的状态。 如果我们想要完全重置或更新现有状态中的某些值,这取决于用例。

如何更新现有状态mapEventToState 中,我们可以使用 state 变量访问当前状态。因此,在产生新状态的同时,我们也可以根据所需的用例从当前状态传递数据。

在您的示例中:如果您想保留名称的旧值并在其为空时传递:

yield DatatestState(
          name: event.name == '' ? state.name : event.name,
          pass: event.pass == '' ? state.pass : event.pass);

它将return以下输出:

a:mohammd b:
a:mohammd b:passsss