Flutter - AndroidView哄辣,使用原生組件嵌入Flutter

最近Flutter推出了WebView預(yù)覽版蹄衷,采用原生組件嵌入到Flutter中,今天特地查閱了一下FlutterWebView的實(shí)現(xiàn)泌神,然后試著寫了一下EditText嵌入到Flutter良漱,然后結(jié)果是成功的,但是輸入框鍵盤不能彈出欢际。母市。。

第一步损趋,創(chuàng)建FlutterEditTextView患久, 實(shí)現(xiàn)接口類:PlatformView, MethodChannel.MethodCallHandler

代碼如下:

import android.content.Context
import android.view.View
import android.widget.EditText
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.platform.PlatformView


class FlutterEditTextView : PlatformView, MethodChannel.MethodCallHandler {

    private var editText: EditText
    private val methodChannel: MethodChannel

    constructor(context: Context?, id: Int, args: Map<String, Any>?, messenger: BinaryMessenger?) {
        editText = EditText(context)
        editText.setText(
            when {
                args?.containsKey("text") == true -> args["text"].toString()
                else -> ""
            }
        )
        if (args?.containsKey("textColor") == true && args["textColor"] != null)
            editText.setTextColor(args["textColor"]!!.toString().toInt())
        editText.hint = when {
            args?.containsKey("text") == true -> args["text"].toString()
            else -> ""
        }
        if (args?.containsKey("hintTextColor") == true && args["hintTextColor"] != null)
            editText.setHintTextColor(args["hintTextColor"]!!.toString().toInt())
        methodChannel = MethodChannel(messenger, "plugins.demo.cn/editor_$id")
        methodChannel.setMethodCallHandler(this)
    }

    override fun getView(): View = editText

    override fun dispose() {
    }

    override fun onMethodCall(methodCall: MethodCall?, result: MethodChannel.Result?) {
    }

}

第二步,實(shí)現(xiàn)Factory類, 繼承PlatformViewFactory

class FlutterEditTextViewFactory(private val messenger: BinaryMessenger) :
    PlatformViewFactory(StandardMessageCodec.INSTANCE) {

    override fun create(context: Context?, id: Int, args: Any?): PlatformView =
        FlutterEditTextView(context, id, args as? Map<String, Any>?, messenger)

}

第三步浑槽,實(shí)現(xiàn)Plugin類

object FlutterEditTextViewPlugin {

    const val ChannelName = "com.mrper.hotpot.core.flutter.plugin.FlutterEditTextViewPlugin"

    @JvmStatic
    fun registerWith(registrar: Registrar) {
        registrar
            .platformViewRegistry()
            .registerViewFactory(
                "plugins.demo.cn/editor", FlutterEditTextViewFactory(registrar.messenger())
            )
    }

}

第四步蒋失,注冊(cè)插件


 val ChannelName = "com.demo.flutter/activity_channel"
   if (!pluginRegistry.hasPlugin(FlutterEditTextViewPlugin.ChannelName))
                FlutterEditTextViewPlugin.registerWith(pluginRegistry.registrarFor(FlutterEditTextViewPlugin.ChannelName))

第五步,F(xiàn)lutter端實(shí)現(xiàn)EditText組件

import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

typedef void EditTextCreatedCallback(EditTextController controller);

class EditText extends StatefulWidget {
  const EditText({
    Key key,
    this.text,
    this.textColor,
    this.hint,
    this.hintTextColor,
    this.onEditTextCreated,
    this.gestureRecognizers,
  }) : super(key: key);

  final String text;
  final int textColor;
  final String hint;
  final int hintTextColor;
  final EditTextCreatedCallback onEditTextCreated;

  final Set<Factory<OneSequenceGestureRecognizer>> gestureRecognizers;

  @override
  State createState() => _EditTextState();
}

class _EditTextState extends State<EditText> {
  @override
  Widget build(BuildContext context) {
    return AndroidView(
      viewType: "plugins.demo.cn/editor",
      onPlatformViewCreated: (id) {},
      layoutDirection: TextDirection.ltr,
      creationParams: _CreationParams.fromWidget(widget).toMap(),
      gestureRecognizers: widget.gestureRecognizers,
      creationParamsCodec: const StandardMessageCodec(),
    );
  }
}

class _CreationParams {
  _CreationParams({
    this.text,
    this.textColor,
    this.hint,
    this.hintTextColor,
  });

  static _CreationParams fromWidget(EditText widget) {
    return _CreationParams(
        text: widget.text,
        textColor: widget.textColor,
        hint: widget.hint,
        hintTextColor: widget.hintTextColor);
  }

  final String text;
  final int textColor;
  final String hint;
  final int hintTextColor;

  Map<String, dynamic> toMap() {
    return <String, dynamic>{
      'text': text,
      'textColor': textColor,
      'hint': hint,
      'hintTextColor': hintTextColor,
    };
  }
}

class EditTextController {
  EditTextController._(int id)
      : _channel = MethodChannel('plugins.demo.cn/editor_$id');

  final MethodChannel _channel;
}

第六步桐玻,Good Job! 你能在你的布局中使用EditText了篙挽,但是效果肯定是。镊靴。铣卡。讓你無(wú)語(yǔ)的,哈哈偏竟,暫時(shí)就這樣煮落,畢竟還只是個(gè)實(shí)驗(yàn)性的功能!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末踊谋,一起剝皮案震驚了整個(gè)濱河市蝉仇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌褪子,老刑警劉巖量淌,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骗村,死亡現(xiàn)場(chǎng)離奇詭異嫌褪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)胚股,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門笼痛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事缨伊≌蹋” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵刻坊,是天一觀的道長(zhǎng)枷恕。 經(jīng)常有香客問我,道長(zhǎng)谭胚,這世上最難降的妖魔是什么徐块? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮灾而,結(jié)果婚禮上胡控,老公的妹妹穿的比我還像新娘。我一直安慰自己旁趟,他們只是感情好昼激,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锡搜,像睡著了一般橙困。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上余爆,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天纷宇,我揣著相機(jī)與錄音,去河邊找鬼蛾方。 笑死像捶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桩砰。 我是一名探鬼主播拓春,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼亚隅!你這毒婦竟也來(lái)了硼莽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤煮纵,失蹤者是張志新(化名)和其女友劉穎懂鸵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體行疏,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匆光,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酿联。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片终息。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夺巩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出周崭,到底是詐尸還是另有隱情柳譬,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布续镇,位于F島的核電站美澳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏摸航。R本人自食惡果不足惜人柿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忙厌。 院中可真熱鬧凫岖,春花似錦、人聲如沸逢净。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爹土。三九已至甥雕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胀茵,已是汗流浹背社露。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留琼娘,地道東北人峭弟。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像脱拼,于是被迫代替她去往敵國(guó)和親瞒瘸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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