【发布时间】:2021-09-25 06:51:55
【问题描述】:
我将值单独赋予事件,但其他变量的值在事件中被重置。我为国家做了同样的事情。我用两个变量定义了一个状态,我通过 copyWith 在不同的地方赋予这些值但是每次发送一个离子时,状态值都会返回到它们的原始状态。 块中的状态和事件是否会在其值的每次更改中重置????
主要
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 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 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
【问题讨论】:
-
你在使用 equatable 吗?
-
是的...但是问题的存在没有解决
-
我问是因为我没有看到你覆盖属性,这可能会导致 bloc 无法正确更新。
-
现在我再次测试了两个事件,每个事件都改变了状态中变量的值,我使用了包 equatable 但是当我用其中一个事件更改状态变量的值时,另一个变量到国家
标签: flutter class events state bloc