为什么在没有文本更改的情况下多次调用文本更改侦听器函数
why text change listener function called multiple time without text change
我有 TextFormField
附加了一个文本更改侦听器。但是即使我单击文本字段时也会调用侦听器函数,有时甚至会在文本字段外单击。我使用的是 flutter 2.5.2 版本。
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
void main() {
runApp(MaterialApp(
home: SearchView(),
));
}
class SearchView extends StatefulWidget {
@override
State<SearchView> createState() => _SearchViewState();
}
class _SearchViewState extends State<SearchView> {
final textController = TextEditingController();
final rng = new Random();
@override
void initState() {
this.textController.addListener(this._onTextChanged);
super.initState();
}
void _onTextChanged() {
print('text changed listener called ${rng.nextDouble()}');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Brand'),
),
body: SingleChildScrollView(
child: Column(
children: [
TextFormField(
controller: this.textController,
),
],
),
),
);
}
}
这似乎与 this issue 有关。这是因为侦听器实际上不仅在侦听 文本更改,而且还在侦听 焦点更改。
你可以做些什么来防止这种情况,并且只监听文本更改,方法是在 TextFormField 上使用 onChanged()
方法,如下所示:
TextFormField(
onChanged: (String newText) => print('$newText'),
),
我有 TextFormField
附加了一个文本更改侦听器。但是即使我单击文本字段时也会调用侦听器函数,有时甚至会在文本字段外单击。我使用的是 flutter 2.5.2 版本。
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
void main() {
runApp(MaterialApp(
home: SearchView(),
));
}
class SearchView extends StatefulWidget {
@override
State<SearchView> createState() => _SearchViewState();
}
class _SearchViewState extends State<SearchView> {
final textController = TextEditingController();
final rng = new Random();
@override
void initState() {
this.textController.addListener(this._onTextChanged);
super.initState();
}
void _onTextChanged() {
print('text changed listener called ${rng.nextDouble()}');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Brand'),
),
body: SingleChildScrollView(
child: Column(
children: [
TextFormField(
controller: this.textController,
),
],
),
),
);
}
}
这似乎与 this issue 有关。这是因为侦听器实际上不仅在侦听 文本更改,而且还在侦听 焦点更改。
你可以做些什么来防止这种情况,并且只监听文本更改,方法是在 TextFormField 上使用 onChanged()
方法,如下所示:
TextFormField(
onChanged: (String newText) => print('$newText'),
),