9 votes

Flutter : getTextBeforeCursor sur une InputConnection inactive

J'essaie de récupérer les données saisies par l'utilisateur dans un champ de type TextField afin de les transmettre à une fonction appelée void _filterList(value) . Cependant, chaque fois que je mets du texte, ces erreurs apparaissent :

W/IInputConnectionWrapper( 7715): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper( 7715): getSelectedText on inactive InputConnection
W/IInputConnectionWrapper( 7715): getTextAfterCursor on inactive InputConnection
W/IInputConnectionWrapper( 7715): beginBatchEdit on inactive InputConnection
W/IInputConnectionWrapper( 7715): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper( 7715): endBatchEdit on inactive InputConnection

Voici mon code :

List filteredlist = [];
List entries = [];
bool isSearching = false;

getCountries() async {
  var response =
    await Dio().get('https://restcountries.eu/rest/v2/regionalbloc/eu');
return response.data;
}

@override
void initState() {
getCountries().then((data) {
  setState(() {
    entries = filteredlist = data;
  });
});
super.initState();
}

@override
Widget build(BuildContext context) {
return Scaffold(
    appBar: AppBar(
      backgroundColor: Colors.blue,
      title: !isSearching
          ? Text('All EU Countries')
          : TextField(
              onChanged: (value) {
                _filterList(value);
              },
              style: TextStyle(color: Colors.white),
              decoration: InputDecoration(
                icon: Icon(Icons.search, color: Colors.white),
                hintText: "Search Here",
                hintStyle: TextStyle(color: Colors.white),
              )),
      actions: <Widget>[
        isSearching
            ? IconButton(
                icon: Icon(Icons.cancel),
                onPressed: () {
                  setState(() {
                    this.isSearching = false;
                    filteredlist = entries;
                  });
                },
              )
            : IconButton(
                icon: Icon(Icons.search),
                onPressed: () {
                  setState(() {
                    this.isSearching = true;
                  });
                })
      ],
    ),
    body: _buildList());
}

C'est ma fonction :

void _filterList(value) {
setState(() {
  filteredlist = entries.where(
      (entry) => entry['name'].toLoweCase().contains(value.toLowerCase()));
});

}

D'après ce que j'ai compris, il semble y avoir un problème avec le clavier, mais je n'ai pas encore trouvé comment l'éviter.

2voto

anas Points 33

Assurez-vous que les contrôleurs des champs de texte sont en dehors de la méthode de construction et que le widget est plein d'état.

1voto

happy_san Points 96

Problème connu, suivi aquí . Même cette exemple de code donne des avertissements dans Android. Il n'y a pas de consensus sur la cause du problème.

J'ai fait quelques recherches. Il semble qu'Android génère ces avertissements parce que nous tenons l'InputConnection de manière incorrecte dans le TextInputPlugin du moteur. Je n'ai pas vraiment compris ce que nous faisons de mal, cependant.

source

1voto

Ercross Points 137

J'ai également rencontré ce problème dans mon projet. La cause du mien était que j'avais un code invoquant MediaQuery.of(context).height dans la méthode de construction de la classe qui renvoie le widget d'échafaudage. J'ai dû l'enlever et le placer dans la classe du widget enfant. Par exemple :

Avant d'avoir...

```Class MyHomePage extends StatelessWidget {
     //some code
     Widget build (BuildContext context) {
       double availableHeight = MediaQuery.of(context).height - statusBarHeight - appBarHeight;
       return Scaffold (//some code that passes availableHeight to a widget's [MyHomePageBody] constructor);
     }
}```

Maintenant, j'ai...

```Class MyHomePage extends StatelessWidget {
     //some code
     Widget build (BuildContext context) {

       return Scaffold (//some code);
     }
}

Class MyHomePageBody extends StatelessWidget {
     //some code
     Widget build (BuildContext context) {
       double availableHeight = MediaQuery.of(context).height - statusBarHeight - appBarHeight;
       return Container (//some code that uses availableHeight);
     }
}```

Une autre solution qui pourrait fonctionner est de s'assurer que votre canal de flottement est sur le canal stable. Si ce n'est pas le cas, vous pouvez changer de canal à l'aide de la commande suivante flutter channel stable

Source : https://github.com/flutter/flutter/issues/11321#

0voto

Pedro R. Points 464

Vous pourriez le faire en utilisant un TextEditingController et un FutureBuilder. Comme ceci :

var searchController = TextEditingController();
var searchTerm = "";

  @override
  void initState() {
    super.initState();
    searchController.addListener(onSearch);
  }

 onSearch() {
    setState(() {
      searchTerm = searchController.text;
      updateList();
    });
  }

  Future updateList() async {
    return await getYourFilteredList(searchTerm);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(     
      body: Center(
        child: Column(
          children: <Widget>[
           TextField(controller: searchController),
            FutureBuilder(
      future: updateList(),
      builder: (context, snapshot) {
        if (snapshot.hasData)
          return Expanded(
            child: _buildList(snapshot.data),
          );
        return CircularProgressIndicator();
      },
    );
          ],
        ),
      ),
    );
  }

Note : Je n'ai pas testé ce code, mais j'ai déjà écrit quelque chose de similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X