テキストフィールドのタイトル内でユーザー入力を取得しようとしているので、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()));
});
_
}
私が絶え間なくても敗北した限り、キーボードに問題があるようですが、私はそれを防ぐ方法を考え出していません
私も私のプロジェクトでもこれを遭遇しました。私の原因は、足場ウィジェットを返すクラスのビルドメソッド内に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が安定したチャンネル上にあることを確認することです。そうでない場合は、次のコマンドflutter channel stable
を介してチャンネルを変更できます。
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();
},
);
],
),
),
);
}
_
注:このコードをテストしませんでしたが、私は似たようなものを書きました。