어떻게 Flutter 에 Android 레이아웃 을 삽입 합 니까?

10010 단어 FlutterAndroid
효과.
본 논문 의 구체 적 인 데모 효 과 는 다음 과 같다.

개발 하 다.
1.먼저 flutter 프로젝트 를 만 들 고 프로젝트 에서 flutter 를 정의 하려 면 레이아웃 을 보 여 줘 야 합 니 다.

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Expanded(
            child: Center(
              child: Text(
                'Android      $_counter  ',
                style: const TextStyle(fontSize: 17.0)),
            ),
          ),
          Container(
            padding: const EdgeInsets.only(bottom: 15.0, left: 5.0),
            child: Row(
              children: <Widget>[
                Image.asset('assets/flutter-mark-square-64.png', scale: 1.5),
                const Text('Flutter', style: TextStyle(fontSize: 30.0)),
              ],
            ),
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _sendFlutterIncrement,
        child: const Icon(Icons.add),
      ),
    );
  }
위 코드 에 나타 난 레이아웃 은 바로 효과 그림 의 Flutter 부분(상반부)입 니 다.FloatingAction Button 을 설정 한 것 은 Flutter 와 Android 의 상호작용 과정 을 보 여주 기 위해 서 입 니 다."Android 버튼 이$를 눌 렀 습 니 다.counter 회"는 상호작용 결 과 를 보 여 주 었 고 Image.asset()는 Flutter 의 로고(flutter 의 레이아웃 을 표시 합 니 다)를 보 여 주 었 습 니 다.이렇게 하 는 이 유 는 Flutter 와 Android 페이지 가 서로 내장 되 어 있 고 데이터 와 상호작용 을 하기 때 문 입 니 다.
2.Android 의 레이아웃 만 들 기:

  <io.flutter.embedding.android.FlutterView
    android:id="@+id/flutter_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    />

  <androidx.coordinatorlayout.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:background="@color/grey"
    >

    <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical"
      >

      <TextView
        android:id="@+id/button_tap"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/button_tap"
        ...
        />

      <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/android"
        ...
        />

    </LinearLayout>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
      android:id="@+id/button"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
       ...
      />

  </androidx.coordinatorlayout.widget.CoordinatorLayout>
io.flutter.embedding.android.FlutterView 는 보 여 줘 야 할 flutter 레이아웃,즉 첫 번 째 단계 에서 작 성 된 레이아웃 입 니 다.나머지 부분 은 첫 번 째 단계 의 논리 와 같 습 니 다.상호작용 결 과 를 보 여 주 는 TextView(@+id/buttontap),안 드 로 이 드 페이지 의 TextView(@string/android)를 표시 하고 상호작용 을 위 한 단추 FloatingActionButton 입 니 다.
3.통신 채널 정의
Flutter:

  static const String _channel = 'increment';
  static const String _pong = 'pong';
  static const String _emptyMessage = '';
  static const BasicMessageChannel<String> platform =
      BasicMessageChannel<String>(_channel, StringCodec());
  int _counter = 0;
  
  @override
  void initState() {
    super.initState();
    platform.setMessageHandler(_handlePlatformIncrement);
  }
  
 Future<String> _handlePlatformIncrement(String message) async {
    setState(() {
      _counter++;
    });
    return _emptyMessage;
  }

  void _sendFlutterIncrement() {
    platform.send(_pong);
  }
코드 에서 통신 채널 은 Basic Message Channel 을 사용 합 니 다.MethodChannel 과 EventChannel 을 사용 하지 않 은 것 은 Basic Message Channel 이 언제 어디서나 통신 할 수 있 기 때 문 입 니 다.다른 두 가 지 는 각자 의 한계 가 있 습 니 다.여 기 는 설명 하지 않 겠 습 니 다.잠시 후에 전문 적 으로 이 세 가지 통신 채널 을 소개 할 것 입 니 다.channel 은 통신 채널 의 이름 입 니 다.이것 은 유일 하고 고정 적 인 것 입 니 다.정의 가 되면 안 드 로 이 드 측 도 같은 이름 을 사용 해 야 합 니 다.그렇지 않 으 면 둘 이 연결 할 수 없어 서 통신 에 실 패 했 습 니 다.pong 은 플 루 터 가 안 드 로 이 드 에 전달 하 는 메시지 콘 텐 츠 로,안 드 로 이 드 가 매번 받 는 콘 텐 츠 는'pong'으로 해당 플 루 터 버튼 클릭 횟수 가+1 이 고 메시지 콘 텐 츠 와 유형 사용 자 는 사용자 정의 가 가능 하 며,Basic MessageChannel 의 범용 과 메시지 인 코딩 메커니즘(글 에서 사용 하 는 것 은 StringCodec)만 정의 하면 된다.메시지 의 내용 이 많 으 면 개발 자 는 JSon 을 사용 하여 메 시 지 를 전달 할 수 있 습 니 다.counter 는 flutter 가 안 드 로 이 드 버튼 을 받 는 클릭 횟수 입 니 다.안 드 로 이 드 버튼 은 클릭 할 때마다counter 는+1.관련 변수 나 상수 정의 가 끝나 면 개발 자 는 initState()에서 메시지 수신 처 리 를 해 야 합 니 다.Basic Message Channel 은 양 방향 통신,platform.setMessage Handler(handle Platform Incrediment)는 받 은 메 시 지 를 처리 하 는 것 입 니 다.handle Platform Incrediment 방법 은 메시지 의 유형 이 String 이 고 메시지 가 비동기 임 을 설명 합 니 다.counter+1 후 setState()를 호출 하여 레이아웃 을 새로 고침 한 후 보 여 주 는 Android 단 추 를 누 르 면 횟수 가+1 됩 니 다.platform.send(_pong)은 Flutter 단 추 를 누 르 고 이 방법 을 호출 한 다음 Basic Message Channel 에서 안 드 로 이 드 에 메 시 지 를 보 내 는 것 입 니 다.
Android:

    private static FlutterEngine flutterEngine;
    private FlutterView flutterView;
    private int counter;
    private static final String CHANNEL = "increment";
    private static final String EMPTY_MESSAGE = "";
    private static final String PING = "ping";
    private BasicMessageChannel<String> messageChannel;
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            if (flutterEngine == null) {
            flutterEngine = new FlutterEngine(this, args);
            flutterEngine.getDartExecutor().executeDartEntrypoint(
                DartEntrypoint.createDefault()
            );
        }
        ...
        flutterView = findViewById(R.id.flutter_view);
        flutterView.attachToFlutterEngine(flutterEngine);

        messageChannel = new BasicMessageChannel<>(flutterEngine.getDartExecutor(), CHANNEL, StringCodec.INSTANCE);
        messageChannel.
            setMessageHandler(new MessageHandler<String>() {
                @Override
                public void onMessage(String s, Reply<String> reply) {
                    onFlutterIncrement();
                    reply.reply(EMPTY_MESSAGE);
                }
            });

        FloatingActionButton fab = findViewById(R.id.button);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendAndroidIncrement();
            }
        });
        ...
CHANNEL 은 통신 채널 의 명칭 이자 채널 의 식별 자 이 므 로 반드시 flutter 와 통일 해 야 합 니 다.그렇지 않 으 면 통신 할 수 없습니다.Basic Message Channel 은 통신 채널 로 플 루 터 엔 드 와 다른 것 을 사용 하면 통신 할 수 없습니다.EMPTY_MESSAGE 는 안 드 로 이 드 측 에서 플 루 터 메 시 지 를 받 고 플 루 터 에 게 안 드 로 이 드 가 메 시 지 를 받 았 다 는 사실 을 플 루 터 에 알 렸 다 는 답변 이다.Android 쪽 에서 메 시 지 를 받 은 후 setMessage Handler 에서 메시지 처리:flutter 버튼 클릭 횟수+1(onFlutter Increment())을 받 은 메 시 지 를 확인 하 는 답장(reply.reply(EMPTYMESSAGE))。FloatingAction Button 에서 클릭 이벤트 가 발생 한 후 sendAndroidIncrediment 방법 을 호출 하면 Flutter 에 게 단 추 를 한 번 눌 렀 다 고 메 시 지 를 보 냅 니 다.

    private void sendAndroidIncrement() {
        messageChannel.send(PING);
    }
PING 는 안 드 로 이 드 가 플 루 터 에 보 낸 메시지 내용 으로 플 루 터 가 메 시 지 를 받 으 면 안 드 로 이 드 에 대한 버튼 클릭 횟수+1 이다.만약 에 전 달 된 소식 이 비교적 많 으 면 구체 적 인 소식 을 판단 하여 어떤 처 리 를 해 야 하 는 지 확인 해 야 한다.본 고 는 한 가지 내용 의 소식 만 전달 하기 때문에 소식 의 파라미터 와 방법 에 대해 판단 하지 않 았 다.코드 에서 flutterView 는 보 여 줘 야 할 Flutter 레이아웃 이 고 flutterEngine 은 flutter 엔진(표현 이 일치 하지 않 음)이 며 flutterView.attachToFlutterEngine(flutterEngine)은 flutterView 에 생명 과 에 너 지 를 주입 하 는 것 입 니 다.그렇지 않 으 면 flutterView 는 생명 과 내용 이 없 는 컨트롤 입 니 다.flutterEngine 과 AppCompat Activity 의 생명 주 기 는 연결 되 어 있 습 니 다.

  @Override
    protected void onResume() {
        super.onResume();
        flutterEngine.getLifecycleChannel().appIsResumed();
    }

    @Override
    protected void onPause() {
        super.onPause();
        flutterEngine.getLifecycleChannel().appIsInactive();
    }

    @Override
    protected void onStop() {
        super.onStop();
        flutterEngine.getLifecycleChannel().appIsPaused();
    }

    @Override
    protected void onDestroy() {
        flutterView.detachFromFlutterEngine();
        super.onDestroy();
    }
안 드 로 이 드 에 서 는 라 이 프 사이클 에 대한 바 인 딩 이 발생 하면 요구 대로 만 하면 지저분 한 문제 가 발생 하지 않 고 문제 가 있어 도 문제 가 되 지 않 는 다 는 것 이다.
총결산
  • Flutter 와 Android 의 상호작용 은 끊임없이 교체 되 는 과정 에서 비교적 완선 되 었 고 최신 Flutter 버 전 은 Flutter 초기 버 전보 다 훨씬 간단 해 졌 다.
  • Flutter 와 Android 의 상호 내장 을 피 할 수 있다 면 가능 한 한 피 할 수 있 습 니 다.이들 의 내장 은 에 너 지 를 많이 소모 하기 때문에 카드 가 걸 리 거나 다운 되 거나 전기 소모 가 많 을 수 있 습 니 다.
  • 설명 하 다.
    일부 코드 가 불완전 합 니 다.자세 한 내용 은 확인 하 십시오demo.
    이상 은 Flutter 에 안 드 로 이 드 레이아웃 을 어떻게 포함 하 는 지 에 대한 상세 한 내용 입 니 다.Flutter 에 안 드 로 이 드 레이아웃 을 포함 하 는 자 료 는 다른 관련 글 에 주목 하 십시오!

    좋은 웹페이지 즐겨찾기