我有一個使用 ScrollablePositionedList.builder(包)的 TextField 小部件。
當用戶在 TextField 中輸入字符時,它會自動將串列滾動到我按字母順序組織的小部件串列中的那個詞。
但是,當沒有完全匹配時,我會嘗試按字母順序按字母順序搜索每個字符輸入到最接近的匹配項。(例如,“ca”將滾動到以“ca”開頭的第一個單詞,例如“cat”——而不是在單詞中間的某個地方只包含“ca”的第一個單詞)。
我可以通過使用 if 陳述句逐個字符地比較來做到這一點 - 但是這看起來效率很低,并且增加了代碼級別以增加潛在的字符長度輸入,其中不發生完全匹配。
問題:由于這似乎是一種非常標準的搜索方法,是否有更好的模式/方法/標準方法可以實作上述結果并可以處理任何長度范圍的字符輸入?我已經搜索了 Flutter 的解決方案,但似乎找不到。
謝謝!
這是我當前按字母順序搜索的解決方案的示例代碼的相關部分(即,對于潛在的更長匹配,這將需要不斷增加)...
else if (_inputtedText.length == 2) {
for (int i = 0; i < _expandedTiles.length; i ) {
if (_inputtedText[0] == _expandedTiles[i].tileModel.word![0]) {
if(_inputtedText[1] == _expandedTiles[i].tileModel.word![1]){
_itemScrollController.scrollTo(
curve: Curves.easeInOut,
index: i,
duration: Duration(milliseconds: 2000));
break;
}
}
/// 代碼省略
/// And a fuller version of code for more context
class _AllWordsState extends State<AllWords> {
final TextEditingController _textEditingController = TextEditingController();
final ItemScrollController _itemScrollController = ItemScrollController();
String _inputtedText = "";
List<Map> _allWords = [];
List<ExpandedTile> _expandedTiles = [];
TileModel _modelTapped = TileModel();
@override
void initState() {
WidgetsBinding.instance!.addPostFrameCallback((timeStamp) {
_textEditingController.addListener(() {
for (int i = 0; i < _expandedTiles.length; i ) {
if (_inputtedText.isEmpty) {
return;
} else if (_inputtedText == _expandedTiles[i].tileModel.word!) {
_itemScrollController.scrollTo(
curve: Curves.easeInOut,
index: i,
duration: Duration(milliseconds: 2000));
return;
}
else if (_inputtedText.length == 1) {
for (int i = 0; i < _expandedTiles.length; i ) {
if (_inputtedText[0] == _expandedTiles[i].tileModel.word![0]) {
_itemScrollController.scrollTo(
curve: Curves.easeInOut,
index: i,
duration: Duration(milliseconds: 2000));
break;
}
}
}
else if (_inputtedText.length == 2) {
for (int i = 0; i < _expandedTiles.length; i ) {
if (_inputtedText[0] == _expandedTiles[i].tileModel.word![0]) {
if(_inputtedText[1] == _expandedTiles[i].tileModel.word![1]){
_itemScrollController.scrollTo(
curve: Curves.easeInOut,
index: i,
duration: Duration(milliseconds: 2000));
break;
}
}
}
}
else if (_expandedTiles[i]
.tileModel
.word!
.contains(_inputtedText)) {
_itemScrollController.scrollTo(
curve: Curves.easeInOut,
index: i,
duration: Duration(milliseconds: 2000));
break;
}
}
});
});
_setUpDatabase();
super.initState();
}
/// code omitted
child: ScrollablePositionedList.builder(
itemScrollController: _itemScrollController,
itemCount: _expandedTiles.length,
itemBuilder: (context, index) {
return buildDisplayBox(
context, index, _expandedTiles, size);
}),
/// code omitted
child: TextField(
controller: _textEditingController,
onChanged: (value) {
_inputtedText = value;
},
/// code omitted
uj5u.com熱心網友回復:
您可以where在任何陣列上使用 Dart搜索并startsWith查找以術語開頭的匹配項:
final myArray = ['abc', 'abd', 'acd', 'bca', 'abe'];
final results = myArray.where((e) => e.startsWith('ab'));
print (results);
結果將是:
(abc, abd, abe)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368798.html
上一篇:如何在串列中隨機選擇1到5之間的10個數字,并且串列必須包含所有數字
下一篇:串列串列中的字串
