flutter - TextEditingController 之前的状态没有在 Flutter 中处理
问题描述
我正在使用我自己的自定义 TextEditingController 将文本添加到TextField
. 我正在处理方法TextEditingController
中的dispose()
。问题是当我在 TextField 中输入一些文本并返回上一个屏幕并再次返回时。文本保留在我不希望它发生的 TextField 中。我想在屏幕从堆栈中弹出后立即清除它。我该如何解决这个问题?
class AddGoalsState extends State<AddGoalScreen> {
GoalsBloc _bloc;
TextEditingController myController = TextEditingController();
@override
void didChangeDependencies() {
super.didChangeDependencies();
_bloc = GoalsBlocProvider.of(context);
}
@override
void dispose() {
myController.dispose();
_bloc.dispose();
super.dispose();
}
Future<bool> _onWillPop(){
Navigator.pop(context, false);
return Future.value(false);
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: _onWillPop,
child: Scaffold(
appBar: AppBar(
title: Text(
"Add Goal",
style: TextStyle(color: Colors.black),
),
backgroundColor: Colors.amber,
elevation: 0.0,
),
body: Container(
padding: EdgeInsets.all(16.0),
alignment: Alignment(0.0, 0.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
nameField(),
Container(margin: EdgeInsets.only(top: 5.0, bottom: 5.0)),
goalField(),
Container(margin: EdgeInsets.only(top: 5.0, bottom: 5.0)),
buttons(),
],
),
),
),
);
}
Widget goalField() {
return StreamBuilder(
stream: _bloc.goalMessage,
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
myController.value = myController.value.copyWith(text: snapshot.data);
return TextField(
controller: myController,
keyboardType: TextInputType.multiline,
maxLines: 3,
onChanged: _bloc.changeGoalMessage,
decoration: InputDecoration(
hintText: "Enter your goal here", errorText: snapshot.error),
);
});
}
我的 BLoC 课程:
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);
}
}
解决方案
推荐阅读
- java - 为什么我运行应用程序时按钮不起作用?
- javascript - 在Javascript中用双引号嵌套替换字符串
- regex - 将字符串转换为所需格式/删除句子中间的句点
- computer-vision - 在 pytorch 中什么是 ([3,128,128]) 和只是 (3,128,128)
- reactjs - 如何在 React.js 中定义仅在身份验证后有效的 PrivateRoute?
- c - 如何将 Swift 对象用作 UnsafeMutablePointer
到 C 函数 - ios - 使用标签栏从另一个视图返回时不调用视图控制器
- python-3.x - Python 3脚本如何在Windows 10开始菜单中添加最近添加的快捷方式?
- javascript - 使用快速 GET 请求从 Mapbox API 接收 2 个响应
- git - 在推送到 Codecommit 时需要特定的提交消息 AWS Lambda