Flutter:getTextBeforeCursor在非活动的InputConnection上



我正在尝试检索TextField标题中的用户输入,以便将其传递给一个名为void _filterList(value)的函数。然而,每次我放一些文本时,都会出现以下错误:

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

这是我的代码:

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

这是我的功能:

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

}

据我所知,键盘似乎有问题,但我还没有想好如何防止

确保文本字段的控制器不在构建方法中,并确保小部件是状态完整的

已知问题,此处跟踪。甚至这个示例代码在android中也给出了警告。对造成这种情况的原因没有达成共识。

我做了一点挖掘。看起来Android生成这些警告是因为我们在引擎的TextInputPlugin中错误地持有InputConnection。不过,我还没有真正弄清楚我们做错了什么。

您可以使用TextEditingController和FutureBuilder来完成此操作。像这样:

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();
},
);
],
),
),
);
}

注意:我没有测试这个代码,但我写了一些类似的东西。

我在项目中也遇到过这种情况。我的原因是我有一个代码在返回Scaffold Widget的类的构建方法中调用MediaQuery.of(context).height。我不得不将它移除,并将其放置在子窗口小部件类中。例如:

在我之前。。。

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

现在,我。。。

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

其他一些可行的解决方案是确保你的颤振通道处于稳定通道上。如果没有,您可以通过以下命令flutter channel stable更改频道

来源:https://github.com/flutter/flutter/issues/11321#

mediaQuery获取高度,在内部构建。它起作用,但在这里它引起了错误。

代码之前:-小部件构建(BuildContext上下文({double_boxHeight=MediaQuery.of(context(.size.height*0.2;……

代码之后:-小部件构建(BuildContext上下文({double_boxHeight=20;……

相关内容

  • 没有找到相关文章

最新更新