大佬教程收集整理的这篇文章主要介绍了dart – Flutter TextField自动完成覆盖,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
像这样的东西:
TextField autocomplete
我不确定小部件的层次结构应该是什么样的,以实现在其他小部件上方显示建议框.@R_735_10675@用Stack小部件,OverflowBox小部件还是别的什么?
层次结构示例的任何帮助表示赞
以下示例应用程序使用建议作为api中的用户类型,并在列表中显示哪个用户可以通过点击进行选择.
> Screenshot 1
> Screenshot 2
> Screenshot 3
import 'package:Flutter/material.dart'; import 'package:search_suggestions/suggestions_page.dart'; void main() => runApp(new MyApp()); class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return new MaterialApp( title: 'Suggestions Demo',debugShowcheckedModeBAnner: false,theme: new ThemeData( brightness: Brightness.light,priMarySwatch: Colors.orange,),home: new SuggestionsPage(),); } }
import 'package:http/http.dart' as http; import 'dart:convert'; import 'package:Flutter/material.dart'; import 'dart:io'; import 'dart:async'; class SuggestionsPage extends StatefulWidget { SuggestionsPage({Key key}) : super(key: key); @override _SuggestionsPageState createState() => new _SuggestionsPageState(); } class _SuggestionsPageState extends State<SuggestionsPage> { static const JsonCodec JSON = const JsonCodec(); final key = new GlobalKey<ScaffoldState>(); final TextEdiTingController _searchQueryController = new TextEdiTingController(); final Focusnode _focusnode = new Focusnode(); bool _isSearching = true; String _searchText = ""; List<String> _searchList = List(); bool _onTap = false; int _onTapTextLength = 0; _SuggestionsPageState() { _searchQueryController.addListener(() { if (_searchQueryController.text.isEmpty) { setState(() { _isSearching = false; _searchText = ""; _searchList = List(); }); } else { setState(() { _isSearching = true; _searchText = _searchQueryController.text; _onTap = _onTapTextLength == _searchText.length; }); } }); } @override void initState() { super.initState(); _isSearching = false; } @override Widget build(BuildContext context) { return new Scaffold( key: key,appBar: buildAppbar(context),body: buildBody(context),); } Widget getFutureWidget() { return new FutureBuilder( future: _buildSearchList(),initialData: List<ListTile>(),builder: (BuildContext context,AsyncSnapshot<List<ListTile>> childItems) { return new Container( color: Colors.white,height: getChildren(childItems).length * 48.0,width: MediaQuery.of(context).size.width,child: new ListView( // padding: new EdgeInsets.only(left: 50.0),children: childItems.data.isnotEmpty ? ListTile .divideTiles( context: context,tiles: getChildren(childItems)) .toList() : List(),); }); } List<ListTile> getChildren(AsyncSnapshot<List<ListTile>> childItems) { if (_onTap && _searchText.length != _onTapTextLength) _onTap = false; List<ListTile> childrenList = _isSearching && !_onTap ? childItems.data : List(); return childrenList; } ListTile _getListTile(String suggestedPhrasE) { return new ListTile( dense: true,title: new Text( suggestedPhrase,style: Theme.of(context).textTheme.body2,onTap: () { setState(() { _onTap = true; _isSearching = false; _onTapTextLength = suggestedPhrase.length; _searchQueryController.text = suggestedPhrase; }); _searchQueryController.SELEction = TextSELEction .fromPosition(new TextPosition(offset: suggestedPhrase.length)); },); } Future<List<ListTile>> _buildSearchList() async { if (_searchText.isEmpty) { _searchList = List(); return List(); } else { _searchList = await _getSuggestion(_searchText) ?? List(); // ..add(_searchText); List<ListTile> childItems = new List(); for (var value in _searchList) { if (!(value.contains(" ") && value.split(" ").length > 2)) { childItems.add(_getListTile(value)); } } return childItems; } } Future<List<String>> _getSuggestion(String hintText) async { String url = "SOME_test_API?s=$hintText&max=4"; var response = await http.get(Uri.parse(url),headers: {"Accept": "application/json"}); List decode = JSON.decode(response.body); if (response.statusCode != httpStatus.OK || decode.length == 0) { return null; } List<String> suggestedWords = new List(); if (decode.length == 0) return null; decode.forEach((f) => suggestedWords.add(f["word"])); // String data = decode[0]["word"]; return suggestedWords; } Widget buildAppbar(BuildContext context) { return new AppBar( title: new Text('Suggestions Demo'),); } Widget buildBody(BuildContext context) { return new SafeArea( top: false,bottom: false,child: new SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 16.0),child: new Stack( children: <Widget>[ new column( children: <Widget>[ Container( height: MediaQuery.of(context).size.height,child: new column( crossAxisAlignment: CrossAxisAlignment.stretch,children: <Widget>[ const SizedBox(height: 80.0),new TextFormField( controller: _searchQueryController,focusnode: _focusnode,onFieldSubmitted: (String value) { print("$value submitted"); setState(() { _searchQueryController.text = value; _onTap = true; }); },onSaved: (String value) => print("$value saved"),decoration: const InputDecoration( border: const UnderlineInputBorder(),filled: true,icon: const Icon(Icons.search),hintText: 'Type two words with space',labelText: 'Seach words *',const SizedBox(height: 40.0),new Center( child: new RaisedButton( color: Colors.orangeAccent,onPressed: () => print("Pressed"),child: const Text( ' Search ',style: const TextStyle(fontSize: 18.0),)),const SizedBox(height: 200.0),],new Container( alignment: Alignment.topCenter,padding: new EdgeInsets.only( // top: MediaQuery.of(context).size.height * .18,top: 136.0,right: 0.0,left: 38.0),child: _isSearching && (!_onTap) ? getFutureWidget() : null) ],); } }
以上是大佬教程为你收集整理的dart – Flutter TextField自动完成覆盖全部内容,希望文章能够帮你解决dart – Flutter TextField自动完成覆盖所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。