国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Flutter 頁面嵌入 Android原生 View

這篇具有很好參考價值的文章主要介紹了Flutter 頁面嵌入 Android原生 View。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

文章主要講解Flutter頁面如何使用Android原生View,但用到了Flutter 和 Android原生 相互通信知識,建議先看完這篇講解通信的文章

Flutter 與 Android原生 相互通信:BasicMessageChannel、MethodChannel、EventChannel-CSDN博客

數(shù)據(jù)觀察監(jiān)聽,F(xiàn)lutter使用ValueNotifier,Android原生使用LiveData,在實體數(shù)據(jù)發(fā)生改變時,自動刷新。

效果圖

Flutter 頁面嵌入 Android原生 View,Flutter + Android 混合開發(fā),flutter,android

圖解

Flutter 頁面嵌入 Android原生 View,Flutter + Android 混合開發(fā),flutter,android

1、Android原生端

1.0 PlatformView

Android:ComputeLayoutPlatform.kt

package com.example.flutter_mix_android.ui.flutterplugin.platform;

import android.content.Context
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import androidx.lifecycle.ViewModelProvider
import com.example.flutter_mix_android.R
import com.example.flutter_mix_android.bean.CountBean
import com.example.flutter_mix_android.databinding.LayoutComputeBinding
import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.platform.PlatformView

/**
 * 封裝成PlatformView
 */
class ComputeLayoutPlatform(
    context: Context,
    rootContext: Context,
    messenger: BinaryMessenger,
    viewId: Int,
    args: Any?,
) : FrameLayout(context), PlatformView, MethodChannel.MethodCallHandler {

    private lateinit var mChannel: MethodChannel
    private lateinit var bind: LayoutComputeBinding
    private lateinit var viewModel: CountBean

    companion object {
        // Android原生View 在Flutter引擎上注冊的唯一標(biāo)識,在Flutter端使用時必須一樣
        private const val ANDROID_SEND_FLUTTER_DATA_NOTICE: String = "androidSendFlutterDataNotice" // Android端 向 Flutter端 發(fā)送數(shù)據(jù)
        private const val ANDROID_GET_FLUTTER_DATA_NOTICE: String = "androidGetFlutterDataNotice" // Android端 獲取 Flutter端 數(shù)據(jù)
        private const val FLUTTER_SEND_ANDROID_DATA_NOTICE: String = "flutterSendAndroidDataNotice" // Flutter端 向 Android端 發(fā)送數(shù)據(jù)
        private const val FLUTTER_GET_ANDROID_DATA_NOTICE: String = "flutterGetAndroidDataNotice" // Flutter端 獲取 Android端 數(shù)據(jù)
    }

    init {
        initChannel(messenger, viewId)
        initView()
        initData(rootContext, args)
    }

    /**
     * 初始化消息通道
     */
    private fun initChannel(messenger: BinaryMessenger, viewId: Int) {
        // 創(chuàng)建 Android端和Flutter端的,相互通信的通道
        // 通道名稱,兩端必須一致
        mChannel = MethodChannel(messenger, "flutter.mix.android/compute/$viewId")

        // 監(jiān)聽來自 Flutter端 的消息通道
        // Flutter端調(diào)用了函數(shù),這個handler函數(shù)就會被觸發(fā)
        mChannel.setMethodCallHandler(this)
    }

    /**
     * 初始化視圖
     */
    private fun initView() {
        LayoutInflater.from(context).inflate(R.layout.layout_compute, this, true)
        bind = LayoutComputeBinding.bind(getChildAt(0))
        bind.add.setOnClickListener {
            val count: Int = viewModel.curNum.value ?: 0
            viewModel.curNum.value = count + 1
        }

        bind.androidSendFlutterData.setOnClickListener {
            androidSendFlutterData()
        }

        bind.androidGetFlutterData.setOnClickListener {
            androidGetFlutterData()
        }
    }

    /**
     * Android端 向 Flutter端 發(fā)送數(shù)據(jù),PUT 操作
     */
    private fun androidSendFlutterData() {
        val map: MutableMap<String, Int> = mutableMapOf<String, Int>()
        map["androidNum"] = viewModel.curNum.value ?: 0

        mChannel.invokeMethod(
            ANDROID_SEND_FLUTTER_DATA_NOTICE,
            map,
            object : MethodChannel.Result {
                override fun success(result: Any?) {
                    Log.d("TAG", "success:$result")
                    updateFlutterNum((result as? Int) ?: 0)
                }

                override fun error(
                    errorCode: String,
                    errorMessage: String?,
                    errorDetails: Any?
                ) {
                    Log.d(
                        "TAG",
                        "errorCode:$errorCode --- errorMessage:$errorMessage --- errorDetails:$errorDetails"
                    )
                }

                /**
                 * Flutter端 未實現(xiàn) Android端 定義的接口方法
                 */
                override fun notImplemented() {
                    Log.d("TAG", "notImplemented")
                }
            })
    }

    /**
     * Android端 獲取 Flutter端 數(shù)據(jù),GET 操作
     */
    private fun androidGetFlutterData() {
        // 說一個坑,不傳參數(shù)可以寫null,
        // 但不能這樣寫,目前它沒有這個重載方法,invokeMethod第二個參數(shù)是Object類型,所以編譯器不會提示錯誤
        // mChannel.invokeMethod(ANDROID_GET_FLUTTER_DATA_NOTICE, object : MethodChannel.Result {

        // public void invokeMethod(@NonNull String method, @Nullable Object arguments)

        mChannel.invokeMethod(
            ANDROID_GET_FLUTTER_DATA_NOTICE,
            null,
            object : MethodChannel.Result {
                override fun success(result: Any?) {
                    Log.d("TAG", "success:$result")
                    updateGetFlutterNum((result as? Int) ?: 0)
                }

                override fun error(
                    errorCode: String,
                    errorMessage: String?,
                    errorDetails: Any?
                ) {
                    Log.d(
                        "TAG",
                        "errorCode:$errorCode --- errorMessage:$errorMessage --- errorDetails:$errorDetails"
                    )
                }

                /**
                 * Flutter端 未實現(xiàn) Android端 定義的接口方法
                 */
                override fun notImplemented() {
                    Log.d("TAG", "notImplemented")
                }
            })
    }

    /**
     * 初始化數(shù)據(jù)
     */
    private fun initData(rootContext: Context, args: Any?) {
        val owner = rootContext as FlutterFragmentActivity
        viewModel = ViewModelProvider(owner)[CountBean::class.java]
        bind.countBean = viewModel
        bind.lifecycleOwner = owner

        // 獲取初始化時 Flutter端 向 Android 傳遞的參數(shù)
        val map: Map<String, Int> = args as Map<String, Int>
        viewModel.getFlutterNum.value = map["flutterNum"]
    }

    /**
     * 監(jiān)聽來自 Flutter端 的消息通道
     *
     * call: Android端 接收到 Flutter端 發(fā)來的 數(shù)據(jù)對象
     * result:Android端 給 Flutter端 執(zhí)行回調(diào)的接口對象
     */
    override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
        // 獲取調(diào)用函數(shù)的名稱
        val methodName: String = call.method
        when (methodName) {
            FLUTTER_SEND_ANDROID_DATA_NOTICE -> {
                // 回調(diào)結(jié)果對象
                // 獲取Flutter端傳過來的數(shù)據(jù)
                val flutterCount: Int? = call.argument<Int>("flutterNum")
                updateFlutterNum(flutterCount ?: 0)
                result.success("success")

                // 回調(diào)狀態(tài)接口對象,里面有三個回調(diào)方法
                // result.success(result: Any?)
                // result.error(errorCode: String, errorMessage: String?, errorDetails: Any?)
                // result.notImplemented()
            }

            FLUTTER_GET_ANDROID_DATA_NOTICE -> {
                result.success(viewModel.curNum.value)
            }

            else -> {
                result.notImplemented()
            }
        }
    }

    fun updateFlutterNum(flutterCount: Int) {
        viewModel.flutterNum.value = flutterCount
    }

    fun updateGetFlutterNum(flutterCount: Int) {
        viewModel.getFlutterNum.value = flutterCount
    }

    override fun getView(): View? {
        return this
    }

    override fun dispose() {}

}

1.1 PlatformViewFactory

Android:ComputeLayoutPlatformFactory.kt

package com.example.flutter_mix_android.ui.flutterplugin.factory

import android.content.Context
import com.example.flutter_mix_android.ui.flutterplugin.platform.ComputeLayoutPlatform
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.StandardMessageCodec
import io.flutter.plugin.platform.PlatformView
import io.flutter.plugin.platform.PlatformViewFactory

/**
 * 通過PlatformView工廠,創(chuàng)建PlatformView
 */
class ComputeLayoutPlatformFactory(
    private val rootContext: Context,
    private val messenger: BinaryMessenger, // 二進(jìn)制信使
) : PlatformViewFactory(StandardMessageCodec.INSTANCE) { // 消息編解碼器

    private lateinit var computeLayoutPlatform: ComputeLayoutPlatform

    override fun create(context: Context, viewId: Int, args: Any?): PlatformView {
        computeLayoutPlatform = ComputeLayoutPlatform(context, rootContext, messenger, viewId, args)
        return computeLayoutPlatform
    }

}

1.2 FlutterPlugin

Android:FlutterPlugin.kt

package com.example.flutter_mix_android.ui.flutterplugin.plugin;

import android.content.Context
import com.example.flutter_mix_android.ui.flutterplugin.factory.ComputeLayoutPlatformFactory
import io.flutter.embedding.engine.plugins.FlutterPlugin

/**
 * 將AndroidView 注冊為 Flutter插件
 *
 * rootContext:這個context,我是用來作ViewModel觀察的,setLifecycleOwner
 */
class ComputeLayoutPlugin(private val rootContext: Context) : FlutterPlugin {

    companion object {
        // Android原生View 在Flutter引擎上注冊的唯一標(biāo)識,在Flutter端使用時必須一樣
        private const val viewType: String = "com.example.flutter_mix_android.ui.flutterplugin.platform/ComputeLayoutPlatform"
    }

    /**
     * 連接到flutter引擎時調(diào)用
     */
    override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
        // 將Android原生View 在Flutter引擎上注冊
        binding.platformViewRegistry.registerViewFactory(
            viewType,
            ComputeLayoutPlatformFactory(rootContext, binding.binaryMessenger)
        )
    }

    /**
     * 與flutter引擎分離時調(diào)用
     */
    override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {}

}

1.3 注冊插件

Android:MainActivity.kt

Ps:建議大家直接使用FlutterFragmentActivity平替掉FlutterActivity,因為

FlutterActivity繼承于Activity;

FlutterFragmentActivity繼承于FragmentActivity,它實現(xiàn)了 LifecycleOwnerViewModelStoreOwner;

package com.example.flutter_mix_android.ui.activity

import com.example.flutter_mix_android.ui.flutterplugin.plugin.ComputeLayoutPlugin
import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine

class MainActivity: FlutterFragmentActivity() {

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        // 注冊為Flutter插件
        flutterEngine.plugins.add(ComputeLayoutPlugin(this))
    }

}

1.4?實體 + LiveData

package com.example.flutter_mix_android.bean

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class CountBean : ViewModel() {

    var curNum: MutableLiveData<Int> = MutableLiveData<Int>() // Android端點擊次數(shù)

    var flutterNum: MutableLiveData<Int> = MutableLiveData<Int>() // Flutter端點擊次數(shù)(接收到的)

    var getFlutterNum: MutableLiveData<Int> = MutableLiveData<Int>() // Flutter端點擊次數(shù)(主動獲取的)

}

2、Flutter端

1.0 頁面完整代碼

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_mix_android/bean/count_bean.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  final CountBean countBean = CountBean();

  late MethodChannel channel;

  // Android原生View 在Flutter引擎上注冊的唯一標(biāo)識,在Flutter端使用時必須一樣
  final String viewType = 'com.example.flutter_mix_android.ui.flutterplugin.platform/ComputeLayoutPlatform';
  static const String FLUTTER_SEND_ANDROID_DATA_NOTICE = 'flutterSendAndroidDataNotice'; // Flutter端 向 Android端 發(fā)送數(shù)據(jù)
  static const String FLUTTER_GET_ANDROID_DATA_NOTICE = 'flutterGetAndroidDataNotice'; // Flutter端 獲取 Android端 數(shù)據(jù)
  static const String ANDROID_SEND_FLUTTER_DATA_NOTICE = 'androidSendFlutterDataNotice'; // Android端 向 Flutter端 發(fā)送數(shù)據(jù)
  static const String ANDROID_GET_FLUTTER_DATA_NOTICE = 'androidGetFlutterDataNotice'; // Android端 獲取 Flutter端 數(shù)據(jù)

  /// 初始化消息通道
  initChannel(int viewId) {
    channel = MethodChannel('flutter.mix.android/compute/$viewId'); // 創(chuàng)建 Flutter端和Android端的,相互通信的通道

    // 監(jiān)聽來自 Android端 的消息通道
    // Android端調(diào)用了函數(shù),這個handler函數(shù)就會被觸發(fā)
    channel.setMethodCallHandler(handler);
  }

  /// 監(jiān)聽來自 Android端 的消息通道
  /// Android端調(diào)用了函數(shù),這個handler函數(shù)就會被觸發(fā)
  Future<dynamic> handler(MethodCall call) async {
    // 獲取調(diào)用函數(shù)的名稱
    final String methodName = call.method;
    switch (methodName) {
      case ANDROID_SEND_FLUTTER_DATA_NOTICE:
        {
          int androidCount = call.arguments['androidNum'];
          countBean.androidNum.value = androidCount;
          return '$ANDROID_SEND_FLUTTER_DATA_NOTICE ---> success';
        }
      case ANDROID_GET_FLUTTER_DATA_NOTICE:
        {
          return countBean.curNum.value ?? 0;
        }
      default:
        {
          return PlatformException(
              code: '-1', message: '未找到Flutter端具體實現(xiàn)函數(shù)', details: '具體描述');
        }
    }
  }

  /// Flutter端 向 Android端 發(fā)送數(shù)據(jù),PUT 操作
  flutterSendAndroidData() {
    Map<String, int> map = {'flutterNum': countBean.curNum.value};
    channel.invokeMethod(FLUTTER_SEND_ANDROID_DATA_NOTICE, map).then((value) {
      debugPrint('$FLUTTER_SEND_ANDROID_DATA_NOTICE --- Result:$value');
    }).catchError((e) {
      if (e is MissingPluginException) {
        debugPrint('$FLUTTER_SEND_ANDROID_DATA_NOTICE --- Error:notImplemented --- 未找到Android端具體實現(xiàn)函數(shù)');
      } else {
        debugPrint('$FLUTTER_SEND_ANDROID_DATA_NOTICE --- Error:$e');
      }
    });
  }

  ///  Flutter端 獲取 Android端 數(shù)據(jù),GET 操作
  flutterGetAndroidData() {
    channel.invokeMethod(FLUTTER_GET_ANDROID_DATA_NOTICE).then((value) {
      debugPrint('$FLUTTER_GET_ANDROID_DATA_NOTICE --- Result:$value');
      countBean.getAndroidNum.value = value ?? 0;
    }).catchError((e) {
      if (e is MissingPluginException) {
        debugPrint('$FLUTTER_GET_ANDROID_DATA_NOTICE --- Error:notImplemented --- 未找到Android端具體實現(xiàn)函數(shù)');
      } else {
        debugPrint('$FLUTTER_GET_ANDROID_DATA_NOTICE --- Error:$e');
      }
    });
  }

  /// 累計點擊次數(shù)
  computeCount() {
    countBean.curNum.value += 1;
  }

  Widget computeWidget() {
    final ButtonStyle btnStyle = ElevatedButton.styleFrom(
        elevation: 0,
        padding: const EdgeInsets.symmetric(horizontal: 12),
        backgroundColor: Colors.white,
        shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(35)));
    return Padding(
      padding: const EdgeInsets.all(16),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          const Text(
            'Flutter頁面',
            style: TextStyle(
                color: Color(0xff0066ff),
                fontSize: 20,
                fontWeight: FontWeight.bold),
          ),
          Padding(
            padding: const EdgeInsets.only(top: 16, bottom: 8),
            child: Row(
              children: [
                ValueListenableBuilder<int>(
                    valueListenable: countBean.curNum,
                    builder: (context, count, _) {
                      return Text('點擊次數(shù):$count',
                          style: const TextStyle(fontSize: 16));
                    }),
                Padding(
                  padding: const EdgeInsets.only(left: 16, right: 8),
                  child: ElevatedButton(
                    style: btnStyle,
                    onPressed: computeCount,
                    child: const Text('+1'),
                  ),
                ),
                ElevatedButton(
                  style: btnStyle,
                  onPressed: flutterSendAndroidData,
                  child: const Text('發(fā)送給Android端'),
                )
              ],
            ),
          ),
          Padding(
            padding: const EdgeInsets.only(bottom: 8),
            child: Row(
              children: [
                ValueListenableBuilder(
                    valueListenable: countBean.getAndroidNum,
                    builder: (context, count, _) {
                      return Text('獲取Android頁面點擊次數(shù):$count',
                          style: const TextStyle(fontSize: 16));
                    }),
                Padding(
                  padding: const EdgeInsets.only(left: 16, right: 3),
                  child: ElevatedButton(
                    style: btnStyle,
                    onPressed: flutterGetAndroidData,
                    child: const Text('獲取Android端數(shù)據(jù)'),
                  ),
                ),
              ],
            ),
          ),
          ValueListenableBuilder(
              valueListenable: countBean.androidNum,
              builder: (context, count, _) {
                return Text('接收Android端發(fā)送的點擊次數(shù):$count',
                    style: const TextStyle(fontSize: 16));
              }),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: const Color(0xffA4D3EE),
      body: SizedBox(
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.height,
        child: SafeArea(
          top: true,
          child: Column(
            children: [
              Expanded(
                  flex: 1,
                  child: AndroidView(
                    viewType: viewType, // Android原生View 在Flutter引擎上注冊的唯一標(biāo)識,在Flutter端使用時必須一樣
                    creationParams: {'flutterNum': countBean.curNum.value}, // Flutter端 初始化時 向Android端 傳遞的參數(shù)
                    creationParamsCodec: const StandardMessageCodec(), // 消息編解碼器
                    onPlatformViewCreated: (viewId) {
                      initChannel(viewId);
                      // 使用 viewId 構(gòu)建不同名稱的 MethodChannel,
                      // 主要應(yīng)用于 多個相同AndroidView一起使用時,避免消息沖突
                      // List<MethodChannel> mChannels = [];
                      // mChannels.add(MethodChannel('flutter.mix.android/compute/$viewId'));
                      // mChannels[0].invokeMethod(method)
                      // mChannels[0].setMethodCallHandler((call) => null)
                    },
                  )),
              Expanded(flex: 1, child: computeWidget()),
            ],
          ),
        ),
      ),
    );
  }

}

1.1 實體 +?ValueNotifier

import 'package:flutter/cupertino.dart';

class CountBean {

  ValueNotifier<int> curNum = ValueNotifier<int>(10); // Flutter端點擊次數(shù)

  ValueNotifier<int> androidNum = ValueNotifier<int>(0); // Android端點擊次數(shù)(接收到的)

  ValueNotifier<int> getAndroidNum = ValueNotifier<int>(0); // Android端點擊次數(shù)(主動獲取的)

}

6、源碼地址

https://github.com/LanSeLianMa/flutter_mix_android文章來源地址http://www.zghlxwxcb.cn/news/detail-810635.html

到了這里,關(guān)于Flutter 頁面嵌入 Android原生 View的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 原生Android與uniapp開發(fā)的H5混合開發(fā)

    原生Android與uniapp開發(fā)的H5混合開發(fā)

    vue版本選擇2.0 ?記住一點,打包H5前修改配置,否則在Android中打開會白屏,修改方式如下 打包成H5,打包后可以在瀏覽器打開確保有內(nèi)容 assets文件夾沒有就自己建 xml布局文件處加入一個webview標(biāo)簽 Activity的 onCreate周期加入如下代碼 運行項目就可以看到uniAPP的頁面了

    2024年02月21日
    瀏覽(21)
  • 微信小程序web-view嵌入uni-app H5頁面,通過H5頁面跳轉(zhuǎn)其他小程序如何操作?

    微信小程序web-view嵌入uni-app H5頁面,通過H5頁面跳轉(zhuǎn)其他小程序如何操作?

    ?微信小程序appId查看方法: 1)有后臺登錄權(quán)限的情況下:登錄微信公眾平臺后, 微信公眾平臺 微信公眾平臺,給個人、企業(yè)和組織提供業(yè)務(wù)服務(wù)與用戶管理能力的全新服務(wù)平臺。 https://mp.weixin.qq.com/ 點擊右上角logo,在“帳號信息”中找到AppID(小程序ID) 2)沒有后臺登錄權(quán)

    2024年02月11日
    瀏覽(91)
  • uniapp微信小程序在web-view嵌入的uniapp H5頁面中預(yù)覽word文件

    在小程序中預(yù)覽文件可以使用uni.uploadFile下載后再uni.openDocument打開預(yù)覽,但uni.openDocument API是不支持H5的,這時候可能會想到使用微軟在線預(yù)覽,但是實際出來的效果會存在各種兼容性問題。因此我們需要在h5頁面中跳回小程序然后走小程序的預(yù)覽文件邏輯。

    2024年02月11日
    瀏覽(89)
  • flutter和android互相調(diào)用、android原生項目與flutter module之間的交互、如何在flutter module中使用原生的方法

    bridge.dart MainActivity.kt MainActivity中 Flutter中 android項目依賴flutter module的方式網(wǎng)上有很多,這里就不做講解。主要說一下這種情況下android如何與flutter module之間進(jìn)行方法的調(diào)用 踩坑:期初我是想讓flutter module調(diào)用它內(nèi)部中的.android文件夾下的原生代碼。.android文件夾下有Flutter、

    2023年04月08日
    瀏覽(20)
  • 微信小程序web-view嵌入uni-app H5頁面,通過H5頁面跳轉(zhuǎn)企業(yè)微信客戶聊天窗口如何操作?

    微信小程序web-view嵌入uni-app H5頁面,通過H5頁面跳轉(zhuǎn)企業(yè)微信客戶聊天窗口如何操作?

    1)找到企業(yè)ID,登錄?企業(yè)微信 企業(yè)微信 https://work.weixin.qq.com/wework_admin/loginpage_wx ?2)找到接入鏈接? 功能-客服-微信客服 微信公眾平臺,給個人、企業(yè)和組織提供業(yè)務(wù)服務(wù)與用戶管理能力的全新服務(wù)平臺。 https://mp.weixin.qq.com/

    2024年02月11日
    瀏覽(97)
  • 【flutter和android原生的異步】

    java android 中,是多線程的 1.flutter中不要以為異步就是多線程? 2.flutter的線程隔離理論? UI 線程 : 在 Flutter 中,UI 線程負(fù)責(zé)處理用戶界面的構(gòu)建和渲染。所有與用戶界面相關(guān)的操作,例如布局計算、繪制和處理用戶輸入等,都在 UI 線程中執(zhí)行。 UI 線程是單線程的,也稱為主

    2024年04月15日
    瀏覽(23)
  • Flutter 與原生交互(Android,iOS)

    本質(zhì)上 Flutter 和 原生通信是通過 Channel 來完成的:Flutter中消息的傳遞是完全異步的; 消息使用 Channel(平臺通道) 在客戶端(UI) 和主機(p平臺) Flutter 與 native端交互三種方式 1.BasicMessageChannel (用于傳遞字符串和半結(jié)構(gòu)化信息,持續(xù)通信使用,例如dart端將服務(wù)器的數(shù)據(jù)陸續(xù)傳入到

    2024年02月17日
    瀏覽(42)
  • flutter開發(fā)實戰(zhàn)-MethodChannel實現(xiàn)flutter與原生Android雙向通信

    flutter開發(fā)實戰(zhàn)-MethodChannel實現(xiàn)flutter與原生Android雙向通信 最近開發(fā)中需要原生Android與flutter實現(xiàn)通信,這里使用的MethodChannel MethodChannel:用于傳遞方法調(diào)用(method invocation)。 通道的客戶端和宿主端通過傳遞給通道構(gòu)造函數(shù)的通道名稱進(jìn)行連接 一個應(yīng)用中所使用的所有通道名稱

    2024年02月13日
    瀏覽(20)
  • 在Android原生項目中 創(chuàng)建 Flutter模塊

    在Android原生項目中 創(chuàng)建 Flutter模塊

    應(yīng)用場景: 在已有的 Android原生項目中,引入Flutter模塊,摸索了兩天,終于給整出來了; 如果是新項目 ,最好直接創(chuàng)建Flutter項目,然后在Fluter的 android / ios目錄中,寫原生代碼; 本文除了講解 Android原生如何創(chuàng)建Flutter模塊外,還會演示在使用 Gradle 高版本 和 低版本 ?時可

    2024年01月19日
    瀏覽(22)
  • Flutter 調(diào)用原生(Android)方法以及數(shù)據(jù)傳輸

    Flutter 調(diào)用原生(Android)方法以及數(shù)據(jù)傳輸

    flutter是一個UI框架,有許多方法和功能只能靠原生自己來調(diào)用,但是我們怎么通過flutter去間接調(diào)用呢?官方給出了兩種方法 在平臺通道之間進(jìn)行消息傳遞: 注:消息和響應(yīng)以異步的形式進(jìn)行傳遞,以確保用戶界面能夠保持響應(yīng)。 flutter端: 然后找到android工程,打開MainActi

    2024年02月10日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包