어떻게 Flutter 에 Android 레이아웃 을 삽입 합 니까?
본 논문 의 구체 적 인 데모 효 과 는 다음 과 같다.
개발 하 다.
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();
}
안 드 로 이 드 에 서 는 라 이 프 사이클 에 대한 바 인 딩 이 발생 하면 요구 대로 만 하면 지저분 한 문제 가 발생 하지 않 고 문제 가 있어 도 문제 가 되 지 않 는 다 는 것 이다.총결산
일부 코드 가 불완전 합 니 다.자세 한 내용 은 확인 하 십시오demo.
이상 은 Flutter 에 안 드 로 이 드 레이아웃 을 어떻게 포함 하 는 지 에 대한 상세 한 내용 입 니 다.Flutter 에 안 드 로 이 드 레이아웃 을 포함 하 는 자 료 는 다른 관련 글 에 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Flutter】DateTime 전월의 일수를 취득한다달의 일수를 취득할 필요가 있어, 의외로 수요 있을까라고 생각했으므로 비망록 정도에 남겨 둡니다. DateTime 날짜에 0을 입력하면 전월 DateTime이 됩니다. 2021년 3월 0일 = 2021년 2월 28일...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.