在 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 个按钮:
btn:您正在通过仅将 Name 参数传递为“mohammd”来触发事件 DataEvent_name。因此,最终状态的值为 name:'mohammd' 和 pass:''。
由于您正在打印当前状态值,因此输出为:
a:mohammd b:
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
我单独给事件赋值,但其他变量的值在事件中被重置。我为国家做了同样的事情。我用两个变量定义了一个状态,我在不同的地方通过 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 个按钮:
btn:您正在通过仅将 Name 参数传递为“mohammd”来触发事件 DataEvent_name。因此,最终状态的值为 name:'mohammd' 和 pass:''。 由于您正在打印当前状态值,因此输出为:
a:mohammd b:
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