如何在 Flutter 中重置 BehaviorSubject 中的最后一个值
How to reset last value in BehaviorSubject in Flutter
您好,我在我的 BLoC class 中使用 BehaviorSubject。我面临的主要问题是即使在调用 drain()
和 close()
之后最终值仍然保留在主题中。我该如何重置它?
Link 至完整项目:https://github.com/SAGARSURI/Goals
这是我的代码。这里 _title
和 _goalMessage
总是 return 最终值,即使在调用 drain()
和 close()
方法之后也是如此:
class GoalsBloc {
final _repository = Repository();
final _title = BehaviorSubject<String>();
final _goalMessage = BehaviorSubject<String>();
final _showProgress = BehaviorSubject<bool>();
Observable<String> get name => _title.stream.transform(_validateName);
Observable<String> get goalMessage =>
_goalMessage.stream.transform(_validateMessage);
Observable<bool> get showProgress => _showProgress.stream;
Function(String) get changeName => _title.sink.add;
Function(String) get changeGoalMessage => _goalMessage.sink.add;
final _validateMessage = StreamTransformer<String, String>.fromHandlers(
handleData: (goalMessage, sink) {
if (goalMessage.length > 10) {
sink.add(goalMessage);
} else {
sink.addError(StringConstant.goalValidateMessage);
}
});
final _validateName = StreamTransformer<String, String>.fromHandlers(
handleData: (String name, sink) {
if (RegExp(r'[!@#<>?":_`~;[\]\|=+)(*&^%0-9-]').hasMatch(name)) {
sink.addError(StringConstant.nameValidateMessage);
} else {
sink.add(name);
}
});
void submit(String email) {
_showProgress.sink.add(true);
_repository
.uploadGoal(email, _title.value, _goalMessage.value)
.then((value) {
_showProgress.sink.add(false);
});
}
void extractText(var image) {
_repository.extractText(image).then((text) {
_goalMessage.sink.add(text);
});
}
Stream<DocumentSnapshot> myGoalsList(String email) {
return _repository.myGoalList(email);
}
Stream<QuerySnapshot> othersGoalList() {
return _repository.othersGoalList();
}
//dispose all open sink
void dispose() async {
await _goalMessage.drain();
_goalMessage.close();
await _title.drain();
_title.close();
await _showProgress.drain();
_showProgress.close();
}
//Convert map to goal list
List mapToList({DocumentSnapshot doc, List<DocumentSnapshot> docList}) {
if (docList != null) {
List<OtherGoal> goalList = [];
docList.forEach((document) {
String email = document.data[StringConstant.emailField];
Map<String, String> goals =
document.data[StringConstant.goalField] != null
? document.data[StringConstant.goalField].cast<String, String>()
: null;
if (goals != null) {
goals.forEach((title, message) {
OtherGoal otherGoal = OtherGoal(email, title, message);
goalList.add(otherGoal);
});
}
});
return goalList;
} else {
Map<String, String> goals = doc.data[StringConstant.goalField] != null
? doc.data[StringConstant.goalField].cast<String, String>()
: null;
List<Goal> goalList = [];
if (goals != null) {
goals.forEach((title, message) {
Goal goal = Goal(title, message);
goalList.add(goal);
});
}
return goalList;
}
}
//Remove item from the goal list
void removeGoal(String title, String email) {
return _repository.removeGoal(title, email);
}
}
您可以将其值显式设置为 null。不知道这是否是个好习惯,但效果很好。
void drainStream(){ _title.value = null; }
尝试_goalMessage.done
– 它将强制流完成,然后丢失数据。
您好,我在我的 BLoC class 中使用 BehaviorSubject。我面临的主要问题是即使在调用 drain()
和 close()
之后最终值仍然保留在主题中。我该如何重置它?
Link 至完整项目:https://github.com/SAGARSURI/Goals
这是我的代码。这里 _title
和 _goalMessage
总是 return 最终值,即使在调用 drain()
和 close()
方法之后也是如此:
class GoalsBloc {
final _repository = Repository();
final _title = BehaviorSubject<String>();
final _goalMessage = BehaviorSubject<String>();
final _showProgress = BehaviorSubject<bool>();
Observable<String> get name => _title.stream.transform(_validateName);
Observable<String> get goalMessage =>
_goalMessage.stream.transform(_validateMessage);
Observable<bool> get showProgress => _showProgress.stream;
Function(String) get changeName => _title.sink.add;
Function(String) get changeGoalMessage => _goalMessage.sink.add;
final _validateMessage = StreamTransformer<String, String>.fromHandlers(
handleData: (goalMessage, sink) {
if (goalMessage.length > 10) {
sink.add(goalMessage);
} else {
sink.addError(StringConstant.goalValidateMessage);
}
});
final _validateName = StreamTransformer<String, String>.fromHandlers(
handleData: (String name, sink) {
if (RegExp(r'[!@#<>?":_`~;[\]\|=+)(*&^%0-9-]').hasMatch(name)) {
sink.addError(StringConstant.nameValidateMessage);
} else {
sink.add(name);
}
});
void submit(String email) {
_showProgress.sink.add(true);
_repository
.uploadGoal(email, _title.value, _goalMessage.value)
.then((value) {
_showProgress.sink.add(false);
});
}
void extractText(var image) {
_repository.extractText(image).then((text) {
_goalMessage.sink.add(text);
});
}
Stream<DocumentSnapshot> myGoalsList(String email) {
return _repository.myGoalList(email);
}
Stream<QuerySnapshot> othersGoalList() {
return _repository.othersGoalList();
}
//dispose all open sink
void dispose() async {
await _goalMessage.drain();
_goalMessage.close();
await _title.drain();
_title.close();
await _showProgress.drain();
_showProgress.close();
}
//Convert map to goal list
List mapToList({DocumentSnapshot doc, List<DocumentSnapshot> docList}) {
if (docList != null) {
List<OtherGoal> goalList = [];
docList.forEach((document) {
String email = document.data[StringConstant.emailField];
Map<String, String> goals =
document.data[StringConstant.goalField] != null
? document.data[StringConstant.goalField].cast<String, String>()
: null;
if (goals != null) {
goals.forEach((title, message) {
OtherGoal otherGoal = OtherGoal(email, title, message);
goalList.add(otherGoal);
});
}
});
return goalList;
} else {
Map<String, String> goals = doc.data[StringConstant.goalField] != null
? doc.data[StringConstant.goalField].cast<String, String>()
: null;
List<Goal> goalList = [];
if (goals != null) {
goals.forEach((title, message) {
Goal goal = Goal(title, message);
goalList.add(goal);
});
}
return goalList;
}
}
//Remove item from the goal list
void removeGoal(String title, String email) {
return _repository.removeGoal(title, email);
}
}
您可以将其值显式设置为 null。不知道这是否是个好习惯,但效果很好。
void drainStream(){ _title.value = null; }
尝试_goalMessage.done
– 它将强制流完成,然后丢失数据。