Размещение собственных представлений Android и iOS в вашем приложении Flutter с представлениями платформы

#android #flutter

#Android #flutter

Вопрос:

Я пытаюсь следовать руководству по Флаттеру: https://flutter.dev/docs/development/platform-integration/platform-views , но код Java содержит ошибки и не компилируется. В частности, NativeViewFactory определяется как имеющий два параметра, но затем вызывается без параметров. Какие изменения можно внести в код, чтобы он компилировал и отображал собственное представление Android во Flutter?

В 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());
    }
 

Ответ №1:

Вот рабочий код для отображения собственного текстового представления Android в Flutter.

Главный.дротик

 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() {}
}

 

Комментарии:

1. Это работает для меня, мне просто нужно изменить цвет фона текста. Потому что фон flutter по умолчанию белый, а цвет Android textview по умолчанию белый. таким образом, изначально вы можете не видеть текст, но он отображается.

2. Это занимает весь экран приложения Flutter. Есть ли способ использовать его с фиксированным размером, например TextView.height = 80, как обычный текстовый виджет для Flutter?

3. А как насчет edittext, scrollview и т. Д.? Я отобразил собственный edittext вместо TextView, но не смог ввести для него какое-либо значение с клавиатуры. Также у меня проблема с Scrollview, Scrollview не прокручивается (по горизонтали, по вертикали)

4. Обратите внимание, что это решение предназначено для виртуального отображения, где из документации функции управления клавиатурой и доступности могут не работать ( docs.flutter.dev / development / platform-integration / android / … )