Flutter   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了dart – Flutter TextField自动完成覆盖大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在努力创建具有自动完成覆盖的TextField.
我有TextFields的表单,我想根据TextField中输入的内容显示建议.

像这样的东西:
TextField autocomplete
我不确定小部件的层次结构应该是什么样的,以实现在其他小部件上方显示建议框.@R_735_10675@用Stack小部件,OverflowBox小部件还是别的什么?

层次结构示例的任何帮助表示赞

解决方法

我使用Stack实现了我的应用程序. TextFormField在一个容器中,ListTiles在另一个容器中,并将listtile作为用户类型覆盖在文本输入字段的容器上.你可以看看
  my app.

以下示例应用程序使用建议作为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,请注明来意。