将文本从主动脉传递到Kotlin中的儿童文本视图

发布于 2025-02-13 20:22:18 字数 2378 浏览 2 评论 0原文

我以前从未与Android Studio和Kotlin合作过,但是通过Native通过Flutter通过数据的任务出现了。 我需要将文本从Main Activity传递,在那里我通过MethodChannel获取文本到AndroidTextView,然后将其传递给Flutter。 我不知道如何传递文本,我试图意图这样做,但看来我做错了什么。

MainAttivity

class MainActivity : FlutterActivity() {
    private val androidViewId = "INTEGRATION_ANDROID"
    private val methodChannel = "CALL_METHOD"
    private val intentMessageId = "CALL"

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        flutterEngine.platformViewsController.registry.registerViewFactory(androidViewId, AndroidTextViewFactory(flutterEngine.dartExecutor.binaryMessenger, Intent()))

        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, methodChannel).setMethodCallHandler {
            call, result ->
            if (call.method == intentMessageId) {
                val intent = Intent()
                intent.putExtra(intentMessageId, call.arguments.toString())
                AndroidTextViewFactory(flutterEngine.dartExecutor.binaryMessenger, intent)
                result.success(call.arguments);
            } else {
                result.notImplemented()
            }
        }
    }
}

AndroidTextView

internal class AndroidTextView(context: Context?, id: Int, creationParams: Map<String?, Any?>?, messenger: BinaryMessenger, data: Intent) : PlatformView {
    private val textView: TextView = TextView(context)

    private val intentMessageId = "CALL"

    override fun getView(): View {
        return textView
    }

    override fun dispose() {}

    init {
        val intent = Intent(context, MainActivity::class.java);
        val text = intent.getStringExtra(intentMessageId);
        textView.textSize = 36f
        textView.text = "$text"
    }
}

AndroidTextViewFactory

class AndroidTextViewFactory(messenger: BinaryMessenger, data: Intent) : PlatformViewFactory(StandardMessageCodec.INSTANCE) {

    private val binaryMessenger: BinaryMessenger = messenger
    private val intent: Intent = data

    override fun create(context: Context?, viewId: Int, args: Any?): PlatformView {
        val creationParams = args as Map<String?, Any?>?
        return AndroidTextView(context, viewId, creationParams, binaryMessenger, intent)
    }
}

I haven't worked with Android Studio and Kotlin before, but the task of passing data from Flutter via native came up.
I need to pass text from MainActivity where I get text via MethodChannel to AndroidTextView and then pass it to Flutter.
I can't figure out how to pass the text, I tried to do it with intent, but it seems I am doing something wrong.

MainActivity

class MainActivity : FlutterActivity() {
    private val androidViewId = "INTEGRATION_ANDROID"
    private val methodChannel = "CALL_METHOD"
    private val intentMessageId = "CALL"

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        flutterEngine.platformViewsController.registry.registerViewFactory(androidViewId, AndroidTextViewFactory(flutterEngine.dartExecutor.binaryMessenger, Intent()))

        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, methodChannel).setMethodCallHandler {
            call, result ->
            if (call.method == intentMessageId) {
                val intent = Intent()
                intent.putExtra(intentMessageId, call.arguments.toString())
                AndroidTextViewFactory(flutterEngine.dartExecutor.binaryMessenger, intent)
                result.success(call.arguments);
            } else {
                result.notImplemented()
            }
        }
    }
}

AndroidTextView

internal class AndroidTextView(context: Context?, id: Int, creationParams: Map<String?, Any?>?, messenger: BinaryMessenger, data: Intent) : PlatformView {
    private val textView: TextView = TextView(context)

    private val intentMessageId = "CALL"

    override fun getView(): View {
        return textView
    }

    override fun dispose() {}

    init {
        val intent = Intent(context, MainActivity::class.java);
        val text = intent.getStringExtra(intentMessageId);
        textView.textSize = 36f
        textView.text = "$text"
    }
}

AndroidTextViewFactory

class AndroidTextViewFactory(messenger: BinaryMessenger, data: Intent) : PlatformViewFactory(StandardMessageCodec.INSTANCE) {

    private val binaryMessenger: BinaryMessenger = messenger
    private val intent: Intent = data

    override fun create(context: Context?, viewId: Int, args: Any?): PlatformView {
        val creationParams = args as Map<String?, Any?>?
        return AndroidTextView(context, viewId, creationParams, binaryMessenger, intent)
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

隱形的亼 2025-02-20 20:22:18

意图,通常用作 明确的意图

显式意图,在同一应用程序中的两个活动之间进行通信。

并且意图是这样的:

class MainActivity : FlutterActivity() {

   fun openActivityTwo(){
        startActivity(Intent(this@MainActivity,ActivityTwo::class.java))
    }
}

class ActivityTwo : FlutterActivity() {}

我看到您的代码非常类似于 flutter教程:在flutter应用中托管本机android视图,带有平台视图

如教程所示,您不需要MethodChannel

只需在MainActivity中注册Android本机视图,


class MainActivity : FlutterActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        flutterEngine
            .platformViewsController
            .registry
            .registerViewFactory("key", NativeViewFactory())
    }


}

然后在dart中使用,


class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  static const String _title = 'Flutter Code Sample';

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: _title,
      home: Scaffold(
        body: One(),
      ),
    );
  }
}

class One extends StatefulWidget {
  const One({Key? key}) : super(key: key);

  @override
  State<One> createState() => _OneState();
}

class _OneState extends State<One> {
  @override
  Widget build(BuildContext context) {
    // This is used in the platform side to register the view.
    const String viewType = 'key';
    // Pass parameters to the platform side.
    const Map<String, dynamic> creationParams = <String, dynamic>{};

    return PlatformViewLink(
      viewType: viewType,
      surfaceFactory: (context, controller) {
        return AndroidViewSurface(
          controller: controller as AndroidViewController,
          gestureRecognizers: const <Factory<OneSequenceGestureRecognizer>>{},
          hitTestBehavior: PlatformViewHitTestBehavior.opaque,
        );
      },
      onCreatePlatformView: (params) {
        return PlatformViewsService.initSurfaceAndroidView(
          id: params.id,
          viewType: viewType,
          layoutDirection: TextDirection.ltr,
          creationParams: creationParams,
          creationParamsCodec: const StandardMessageCodec(),
          onFocus: () {
            params.onFocusChanged(true);
          },
        )
          ..addOnPlatformViewCreatedListener(params.onPlatformViewCreated)
          ..create();
      },
    );
  }
}

您可以在没有方法频道的情况下处理相关数据

Intent, usually used as Explicit Intent,

Explicit Intent, communicates between two activities inside the same application.

And the intent is used like this:

class MainActivity : FlutterActivity() {

   fun openActivityTwo(){
        startActivity(Intent(this@MainActivity,ActivityTwo::class.java))
    }
}

class ActivityTwo : FlutterActivity() {}

And I see that your code is very much like the flutter tutorial: Hosting native Android views in your Flutter app with Platform Views

as the tutorial shows, you don't need the MethodChannel

simply register the android native view in MainActivity


class MainActivity : FlutterActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        flutterEngine
            .platformViewsController
            .registry
            .registerViewFactory("key", NativeViewFactory())
    }


}

then used in dart


class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  static const String _title = 'Flutter Code Sample';

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: _title,
      home: Scaffold(
        body: One(),
      ),
    );
  }
}

class One extends StatefulWidget {
  const One({Key? key}) : super(key: key);

  @override
  State<One> createState() => _OneState();
}

class _OneState extends State<One> {
  @override
  Widget build(BuildContext context) {
    // This is used in the platform side to register the view.
    const String viewType = 'key';
    // Pass parameters to the platform side.
    const Map<String, dynamic> creationParams = <String, dynamic>{};

    return PlatformViewLink(
      viewType: viewType,
      surfaceFactory: (context, controller) {
        return AndroidViewSurface(
          controller: controller as AndroidViewController,
          gestureRecognizers: const <Factory<OneSequenceGestureRecognizer>>{},
          hitTestBehavior: PlatformViewHitTestBehavior.opaque,
        );
      },
      onCreatePlatformView: (params) {
        return PlatformViewsService.initSurfaceAndroidView(
          id: params.id,
          viewType: viewType,
          layoutDirection: TextDirection.ltr,
          creationParams: creationParams,
          creationParamsCodec: const StandardMessageCodec(),
          onFocus: () {
            params.onFocusChanged(true);
          },
        )
          ..addOnPlatformViewCreatedListener(params.onPlatformViewCreated)
          ..create();
      },
    );
  }
}

you can handle the relevant data without method channel

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文