在Flutter应用中使用平台视图承载原生Android和iOS视图

5

我正在尝试按照Flutter教程: https://flutter.dev/docs/development/platform-integration/platform-views操作,但是Java代码存在错误且无法编译。具体来说,NativeViewFactory被定义为具有两个参数,但是被调用时没有参数。需要对代码进行哪些更改,以使其能够编译并在Flutter中显示本机Android视图?

在 NativeViewFactory.java 中:

 @NonNull private final BinaryMessenger messenger;
 @NonNull private final View containerView;

 NativeViewFactory(@NonNull BinaryMessenger messenger, @NonNull View containerView) {
    super(StandardMessageCodec.INSTANCE);
    this.messenger = messenger;
    this.containerView = containerView;
  }

在MainActivity.java中:
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        flutterEngine
            .getPlatformViewsController()
            .getRegistry()
            .registerViewFactory("<platform-view-type>", new NativeViewFactory());
    }

请参考以下完整教程:https://codingwithtashi.medium.com/flutter-platformview-how-to-host-native-android-and-ios-view-in-flutter-79259faebd91。 - Kunchok Tashi
1个回答

6
这是可用的代码,用于在Flutter中显示原生Android TextView。
Main.dart
import 'package:flutter/material.dart';


void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) => MaterialApp( home: Native() );
}

class Native extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Expanded( child: AndroidView(viewType: "view1",) ),
        ],
      ),
    );
  }
}

MainActivity.java

package com.example.native_view_test;

import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;

public class MainActivity extends FlutterActivity {
    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        flutterEngine
                .getPlatformViewsController()
                .getRegistry()
                .registerViewFactory("view1", new NativeViewFactory());
    }
}

NativeViewFactory.java

package com.example.native_view_test;

import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.Map;
import io.flutter.plugin.common.StandardMessageCodec;
import io.flutter.plugin.platform.PlatformView;
import io.flutter.plugin.platform.PlatformViewFactory;

class NativeViewFactory extends PlatformViewFactory {

    NativeViewFactory() {
        super(StandardMessageCodec.INSTANCE);
    }

    @Override
    public PlatformView create(@NonNull Context context, int id, @Nullable Object args) {
        final Map<String, Object> creationParams = (Map<String, Object>) args;
        return new NativeView(context, id, creationParams);
    }
}

NativeView.java

package com.example.native_view_test;

import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.widget.TextView;
import java.util.Map;
import io.flutter.plugin.platform.PlatformView;

class NativeView implements PlatformView {
    private final TextView textView;

    NativeView(Context context, int id, Map<String, Object> creationParams) {
        textView = new TextView(context);
        textView.setTextSize(42);
        textView.setBackgroundColor(Color.rgb(255, 255, 255));
        textView.setText("Rendered on a native Android view (id: " + id + ")");
    }

    @Override
    public View getView() {
        return textView;
    }

    @Override
    public void dispose() {}
}


这对我有效,我只需要更改文本 BackgroundColor。因为Flutter默认背景是白色,而Android的TextView默认颜色也是白色。所以最初您可能看不到文本,但它正在渲染。 - Shailesh Bhokare
这会占用Flutter应用程序的整个屏幕。有没有办法像普通的Flutter Text Widget一样使用固定大小,例如textView.height = 80? - Viktor Jovanovski
那么EditText、ScrollView等呢?我已经将原生的EditText替换了TextView,但无法输入任何键盘值。同时,我也有ScrollView的问题,它无法滚动(水平、垂直)。 - Ram Mandal
请注意,此解决方案适用于虚拟显示器,在该文档中,键盘处理和辅助功能可能无法正常工作(https://docs.flutter.dev/development/platform-integration/android/platform-views?tab=android-platform-views-kotlin-tab)。 - sweetfa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接