Flutter實(shí)現(xiàn)代碼提示功能

1.簡(jiǎn)介

在實(shí)現(xiàn)代碼提示功能前沪悲,我們先來看看什么是代碼提示,當(dāng)我輸入關(guān)鍵字String 時(shí)阱表,如果輸入到 Stri 的時(shí)候殿如,編輯器會(huì)為我找出所有包含 Stri 的代碼關(guān)鍵詞,這個(gè)時(shí)候最爬,我們只要選中需要輸入的關(guān)鍵字涉馁,它就會(huì)為我補(bǔ)充剩余的單詞,這個(gè)就是代碼提示功能爱致,那么在Flutter 中如何實(shí)現(xiàn)這一功能呢烤送?

2.RawAutocomplete

Flutter 為我們提供了這一個(gè)Widget, 在名字看來糠悯,是可以自動(dòng)完成填充代碼的Widget帮坚,我們來看看它的參數(shù)

類型 屬性 介紹
AutocompleteOptionsViewBuilder<T> optionsViewBuilder 構(gòu)建選項(xiàng)框視圖
AutocompleteOptionToString<T> displayStringForOption 默認(rèn)是(T)t.toString() , 取T的其中一個(gè)字段顯示
AutocompleteOptionsBuilder<T> optionsBuilder 查找符合的提示選項(xiàng)
AutocompleteFieldViewBuilder? fieldViewBuilder 構(gòu)建輸入框視圖
FocusNode? focusNode 控制輸入框焦點(diǎn)
AutocompleteOnSelected<T>? onSelected 當(dāng)選中選項(xiàng)時(shí)妻往,會(huì)調(diào)用

3.示例代碼

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData.dark(),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  List<String> options = [
    'int',
    'double',
    'String',
    'num',
    'void',
    'extends',
    'class',
    'Widget',
    'StatefulWidget',
    'StatelessWidget',
    'abstract',
    'BuildContext',
  ];

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: RawAutocomplete<String>(
        onSelected: (s) {
          print('$s');
        },
        optionsViewBuilder: (
          BuildContext context,
          AutocompleteOnSelected<String> onSelected,
          Iterable<String> options,
        ) {
          return Align(
            alignment: Alignment.topLeft,
            child: Material(
              elevation: 0.0,
              child: Container(
                color: Theme.of(context).cardColor,
                constraints: BoxConstraints(maxHeight: 360),
                child: ListView.builder(
                  itemBuilder: (BuildContext context, int index) {
                    String text = options.elementAt(index);
                    return ListTile(
                      onTap: () {
                        onSelected.call(text);
                      },
                      title: Text(text),
                    );
                  },
                  itemCount: options.length,
                ),
              ),
            ),
          );
        },
        optionsBuilder: (TextEditingValue textEditingValue) {
          if (textEditingValue.text.isEmpty) return [];
          String text = textEditingValue.text;
          if (text.contains(' ')) {
            text = text.split(' ').last;
          }
          return options
              .where((element) => RegExp('(.*)$text(.*)', caseSensitive: false)
                  .hasMatch(element))
              .toList();
        },
        fieldViewBuilder: (BuildContext context,
            TextEditingController textEditingController,
            FocusNode focusNode,
            VoidCallback onFieldSubmitted) {
          return TextFormField(
            controller: textEditingController,
            focusNode: focusNode,
            onFieldSubmitted: (String value) {
              onFieldSubmitted();
            },
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

4.效果如下

image.png

5.更多內(nèi)容

關(guān)于我的更多插件

  • r_router路由跳轉(zhuǎn),可實(shí)現(xiàn)路由攔截试和,路由注冊(cè)讯泣,無Context 跳轉(zhuǎn)、彈對(duì)話框
  • r_logger日志打印阅悍,突破控制臺(tái)輸出最大字?jǐn)?shù)限制
  • r_upgrade應(yīng)用升級(jí)好渠,Android可實(shí)現(xiàn)通知欄下載進(jìn)度,熱更新节视,增量更新拳锚,跳轉(zhuǎn)到應(yīng)用商店,跳轉(zhuǎn)網(wǎng)頁功能肴茄,IOS實(shí)現(xiàn)跳轉(zhuǎn)App Store晌畅,跳轉(zhuǎn)網(wǎng)頁
  • r_scan 二維碼/條形碼掃碼,可自定義掃碼窗口
  • r_calendar 可完全自定義的日歷插件寡痰,支持多選抗楔,連選,單選拦坠,切換同步连躏,周/月視圖切換等功能
  • r_dotted_line_border 可簡(jiǎn)單實(shí)現(xiàn)虛線邊框,直接在Container使用
  • r_album 實(shí)現(xiàn)簡(jiǎn)單同步相片到Android/IOS相冊(cè)
  • fluct 通過命令行生成資源文件引用等

文章首次發(fā)布于:https://rhyme95.cn/archives/611.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贞滨,一起剝皮案震驚了整個(gè)濱河市入热,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晓铆,老刑警劉巖勺良,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異骄噪,居然都是意外死亡尚困,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門链蕊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來事甜,“玉大人,你說我怎么就攤上這事滔韵÷咔” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵陪蜻,是天一觀的道長(zhǎng)邦马。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么勇婴? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任忱嘹,我火速辦了婚禮,結(jié)果婚禮上耕渴,老公的妹妹穿的比我還像新娘拘悦。我一直安慰自己,他們只是感情好橱脸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布础米。 她就那樣靜靜地躺著,像睡著了一般添诉。 火紅的嫁衣襯著肌膚如雪屁桑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天栏赴,我揣著相機(jī)與錄音蘑斧,去河邊找鬼。 笑死须眷,一個(gè)胖子當(dāng)著我的面吹牛竖瘾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播花颗,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捕传,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了扩劝?” 一聲冷哼從身側(cè)響起庸论,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棒呛,沒想到半個(gè)月后聂示,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡簇秒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年鱼喉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宰睡。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖气筋,靈堂內(nèi)的尸體忽然破棺而出拆内,到底是詐尸還是另有隱情,我是刑警寧澤宠默,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布麸恍,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抹沪。R本人自食惡果不足惜刻肄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望融欧。 院中可真熱鬧敏弃,春花似錦、人聲如沸噪馏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欠肾。三九已至瓶颠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刺桃,已是汗流浹背粹淋。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瑟慈,地道東北人桃移。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像封豪,于是被迫代替她去往敵國(guó)和親谴轮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容