Flutter: getTextBeforeCursor on inactive InputConnection

17.3k Views Asked by At

I'm trying to retrieve the user input inside a TextField title so it can be passed to a function called void _filterList(value). However, everytime I put some text this errors appear:

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

This is my 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());
}

This is my function:

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

}

As far as I have undestrood there seems to be a problem with the keyboard, but I haven't figured out how to prevent it

5

There are 5 best solutions below

2
On

mediaQuery to get height, was inside build. It works, but here it caused error.

Code Before:- Widget build(BuildContext context) { double _boxHeight = MediaQuery.of(context).size.height * 0.2; ....

Code After:- Widget build(BuildContext context) { double _boxHeight = 20; ....

0
On

Make sure the controllers of the textfields are out of the build method and make sure the widget is statefull

1
On

I encountered this in my project too. The cause of mine was I had a code invoking MediaQuery.of(context).height inside the build method of the class that returns the Scaffold Widget. I had to remove it and place it in the child widget class. For example:

Before I had...

```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);
     }
}```

Now, I have...

```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);
     }
}```

Some other fix that could work is to ensure your flutter channel is on the stable channel. If not, you can change the channel through the following command flutter channel stable

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

1
On

Known issue, tracked here. Even this sample code gives warnings in android. No consensus on what's causing it.

I did a little bit of digging. It looks like Android is generating these warnings because we are holding the InputConnection incorrectly in the Engine's TextInputPlugin. I haven't really figured out what we're doing wrong, though.

source

0
On

You could do it using a TextEditingController and a FutureBuilder. Like this:

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: I did not test this code, but I have written something similar.