程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Flutter 2.0 - 自动完成小部件从右侧退出屏幕大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Flutter 2.0 - 自动完成小部件从右侧退出屏幕?

开发过程中遇到Flutter 2.0 - 自动完成小部件从右侧退出屏幕的问题如何解决?下面主要结合日常开发的经验,给出你关于Flutter 2.0 - 自动完成小部件从右侧退出屏幕的解决方法建议,希望对你解决Flutter 2.0 - 自动完成小部件从右侧退出屏幕有所启发或帮助;

如何使自动完成框与没有特定宽度的 TextFIEld 大小相同,它占用最大宽度。

              autocomplete(
                optionsBuilder: (TextEdiTingValue textEdiTingvalue) {
                  if (textEdiTingValue.text == '') {
                    return ['aa','bb','cc','aa','cc'];
                  }
                  return ['aa','cc']
                      .where((String option) {
                    return option
                        .toString()
                        .contains(textEdiTingValue.text.tolowerCase());
                  });
                },onSELEcted: (option) {
                  print(option);
                },),

Flutter 2.0 - 自动完成小部件从右侧退出屏幕

解决方法

我在尝试基于 RawAutocomplete 制作我自己的自动完成小部件时遇到了同样的问题,我使用布局构建器在我的 optionsViewBuilder 中获得完美的容器宽度大小:

LayoutBuilder(
  builder: (context,consTraints) => RawAutocomplete<String>(
    focusnode: focusnode,fieldViewBuilder: fieldViewBuilder,optionsViewBuilder: (context,onSELEcted,options) => Align(
      alignment: Alignment.topLeft,child: Material(
        shape: const RoundedRectangleBorder(
          borderRadius: BorderRadius.vertical(bottom: Radius.circular(4.0)),),child: Container(
          height: 52.0 * options.length,width: consTraints.biggest.width,// <-- Right here !
          child: ListView.builder(
            padding: EdgeInsets.zero,itemCount: options.length,shrinkWrap: false,itemBuilder: (BuildContext context,int indeX) {
              final String option = options.elementAt(indeX);
              return InkWell(
                onTap: () => onSELEcted(option),child: Padding(
                  padding: const EdgeInsets.all(16.0),child: Text(option),);
            },optionsBuilder: (textEdiTingvalue) =>
        suggestions.where((element) => element.contains(textEdiTingValue.text.trim().toUpperCase())),textEdiTingController: controller,)

结果: Expected result on my component

,

我也经常遇到这个问题,选项构建器非常具体地说明了它希望将大小或填充放置在层次结构中的位置。这是我的工作示例:

optionsViewBuilder: (context,onAutoCompleteSELEct,options) {
  return Align(
    alignment: Alignment.topLeft,child: Material(
         color: Theme.of(context).priMaryColorLight,elevation: 4.0,// size works,when placed here below the Material widget
           child: Container(
              // I have the text field wrapped in a container with
              // EdgeInsets.all(20) so subtract 40 from the width for the width
              // of the text box. You could also just use a padding widget
              // with EdgeInsets.only(right: 20)
              width: MediaQuery.of(context).size.width - 40,child: ListView.separated(
                   shrinkWrap: true,padding: const EdgeInsets.all(8.0),separatorBuilder: (context,i) {
                     return Divider();
                   },int indeX) {
                     // some child here
                   },)
              ),)
        );
     }

,

您是否尝试将整个自动完成小部件放在一个大小合适的框中? 如果大小调整小部件不起作用,这可能是一个错误。

,

我遇到了同样的问题,并通过使ValueListenableBuilder 解决了它。

@H_592_3@material 小部件的宽度取决于 field ViewBuilder 返回的小部件的宽度(默认为 TextFormField),因此一种解决方案是在之后获得 TextFormField 的宽度完成一帧并通知您的自定义optionsViewBuilder

示例代码:

import 'package:flutter/material.dart';

class AutocompleteText extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => AutocompleteTextState();
}

class AutocompleteTextState extends State<AutocompleteText> {
  final ValueNotifier<double?> optionsViewWidthNotifier = ValueNotifier(null);

  static const List<User> _userOptions = <User>[
    User(name: 'Alice',email: 'alice@example.com'),User(name: 'Bob',email: 'bob@example.com'),User(name: 'Charlie',email: 'charlie123@gmail.com'),];

  static String _displayStringForOption(User option) => option.name;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Padding(
      padding: EdgeInsets.all(20),child: Autocomplete<User>(
        displayStringForOption: _displayStringForOption,optionsBuilder: (TextEdiTingValue textEdiTingvalue) {
          if (textEdiTingValue.text == '') {
            return const Iterable<User>.empty();
          }
          return _userOptions.where((User option) {
            return option
                .toString()
                .contains(textEdiTingValue.text.toLowerCase());
          });
        },onSELEcted: (User SELEction) {
          print('You just SELEcted ${_displayStringForOption(SELEction)}');
        },fieldViewBuilder: (BuildContext context,TextEdiTingController textEdiTingController,Focusnode focusnode,VoidCallBACk onFieldSubmitted) {
          return OrientationBuilder(builder: (context,orientation) {
            WidgetsBinding.instance!.addPostFrameCallBACk((timestamp) {
              optionsViewWidthNotifier.value =
                  (context.findRenderObject() as RenderBoX).size.width;
            });
            return TextFormField(
              controller: textEdiTingController,focusnode: focusnode,onFieldSubmitted: (String value) {
                onFieldSubmitted();
              },);
          });
        },optionsViewBuilder: (
          BuildContext context,AutocompleteOnSELEcted<User> onSELEcted,Iterable<User> options,) {
          return ValueListenableBuilder<double?>(
              valueListenable: optionsViewWidthNotifier,builder: (context,width,_child) {
                return Align(
                  alignment: Alignment.topLeft,child: Material(
                    elevation: 4.0,child: SizedBox(
                      width: width,height: 200.0,child: ListView.builder(
                        padding: EdgeInsets.zero,int indeX) {
                          final User option = options.elementAt(indeX);
                          return InkWell(
                            onTap: () {
                              onSELEcted(option);
                            },child: Padding(
                              padding: const EdgeInsets.all(16.0),child: Text(_displayStringForOption(option)),);
                        },);
              });
        },));
  }

  @override
  void dispose() {
    optionsViewWidthNotifier.dispose();
    super.dispose();
  }
}

@immutable
class User {
  const User({
    required this.email,required this.name,});

  final String email;
  final String name;

  @override
  String toString() {
    return '$name,$email';
  }

  @override
  bool operator ==(Object other) {
    if (other.runtimeType != runtimeTypE) {
      return false;
    }
    return other is User && other.name == name && other.email == email;
  }

  @override
  int get hashCode => hashValues(email,Name);
}

大佬总结

以上是大佬教程为你收集整理的Flutter 2.0 - 自动完成小部件从右侧退出屏幕全部内容,希望文章能够帮你解决Flutter 2.0 - 自动完成小部件从右侧退出屏幕所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:-2.0Flutter