为什么在没有文本更改的情况下多次调用文本更改侦听器函数

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'),
),