Android IntentはFlutterの中で何に等価ですか?データ転送とstartActivity ForResultがFlutterで何に等しいか

7146 ワード

Intents IntentはFlutterで何に等しいですか?**Androidでは、Intentsには主に2つの使用シーンがあります.Activity間を切り替えたり、外部コンポーネントを呼び出したりします.FlutterはIntentsの概念を持っていないが、必要であればNative統合によってInentsをトリガすることができる.
Flutterで画面を切り替えるには、ルーティングにアクセスして新しいWidgetを描画します.複数の画面を管理するには、RouteとNavigatorの2つのコアコンセプトとクラスがあります.Routeはアプリケーションの「画面」または「ページ」の抽象(Activityと考えられる)であり、NavigatorはRouteを管理するWidgetである.Navigatorはpushとpop routeによってページ切り替えを実現することができる.
Androidと似ていますが、Android Manifestで利用できます.xmlでActivitiesを宣言します.Fluterでは、指定したRouteを持つMapを最上位のMaterialAppインスタンスに渡すことができます.
void main() {
  runApp(new MaterialApp(
    home: new MyAppHome(), // becomes the route named '/'
    routes:  {
      '/a': (BuildContext context) => new MyPage(title: 'page A'),
      '/b': (BuildContext context) => new MyPage(title: 'page B'),
      '/c': (BuildContext context) => new MyPage(title: 'page C'),
    },
  ));
}

その後、Navigatorで名前付きルーティングのページに切り替えることができます.
Navigator.of(context).pushNamed('/b');

Intentsのもう一つの主な用途は、CameraやFile pickerなどの外部コンポーネントを呼び出すことです.このためにはnativeとの統合(または既存のライブラリを使用)が必要です.
[Flutter Plugins]を参照して、nativeとの統合方法について説明します.
外部アプリケーションから送信されたIntents FlutterをFlutterでどのように処理するかは、Androidレイヤと直接通信し、共有データを要求することでAndroidからのIntentsを処理することができます.
この例では、テキスト共有intentを登録するので、他のアプリケーションは私たちのFlutterアプリケーションにテキストを共有することができます.
このアプリケーションの基本的な流れは、まずAndroid側の共有テキストデータを処理し、Flutter要求データを待ってからMethodChannelで送信することです.
まずAndroidManifestでxmlに処理したいintentを登録します

       
       
       
           
           
       
       
           
           
           
       
   

その後、MainActivityではintentを処理できます.intentから共有テキストデータを取得すると、Flutterが準備完了時に要求するまで、それを保持します.
package com.yourcompany.shared;

import android.content.Intent;
import android.os.Bundle;

import java.nio.ByteBuffer;

import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.ActivityLifecycleListener;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity {
    String sharedText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        GeneratedPluginRegistrant.registerWith(this);
        Intent intent = getIntent();
        String action = intent.getAction();
        String type = intent.getType();

        if (Intent.ACTION_SEND.equals(action) && type != null) {
            if ("text/plain".equals(type)) {
                handleSendText(intent); // Handle text being sent
            }
        }

        new MethodChannel(getFlutterView(), "app.channel.shared.data").setMethodCallHandler(new MethodChannel.MethodCallHandler() {
            @Override
            public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
                if (methodCall.method.contentEquals("getSharedText")) {
                    result.success(sharedText);
                    sharedText = null;
                }
            }
        });
    }


    void handleSendText(Intent intent) {
        sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
    }
}

最後に、Flutterでは、Flutterビューをレンダリングするときにデータを要求できます.
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(new SampleApp());
}

class SampleApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Sample Shared App Handler',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new SampleAppPage(),
    );
  }
}

class SampleAppPage extends StatefulWidget {
  SampleAppPage({Key key}) : super(key: key);

  @override
  _SampleAppPageState createState() => new _SampleAppPageState();
}

class _SampleAppPageState extends State {
  static const platform = const MethodChannel('app.channel.shared.data');
  String dataShared = "No data";

  @override
  void initState() {
    super.initState();
    getSharedText();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(body: new Center(child: new Text(dataShared)));
  }

  getSharedText() async {
    var sharedData = await platform.invokeMethod("getSharedText");
    if (sharedData != null) {
      setState(() {
        dataShared = sharedData;
      });
    }
  }
}

startActivity ForResultは、Flutter内のすべてのルーティングを処理するNavigatorクラスと同等のものをFlutterで使用して、pushからスタックへのルーティングから結果を取得することができる.これはpushが返すFutureを待つことによって達成できる.たとえば、ユーザーが場所を選択するルーティングを開始する場合は、次の操作を行います.
Map coordinates = await Navigator.of(context).pushNamed('/location');

そして、あなたの位置ルーティングでは、ユーザーが彼らの位置を選択すると、結果「pop」をスタックから出すことができます.
Navigator.of(context).pop({"lat":43.821757,"long":-79.226392});

また、以下のブログ記事を見て、以前と継続的な学習を振り返ってみることもできます.私が開発を学ぶ上で出会った難題なども含まれています.
Flutter入門、学習過程、開発に入り、Android携帯電話でVisual Studio codeツール開発flutte Flutterプラットフォーム間開発なぜFlutterプラットフォーム間開発を選んだのかFlutter Android開発者for Flutter(1)FlutterとAndroidにおけるViewの対比とwidget Android開発者for Flutter(2)のレイアウトをどのように更新するのかをまとめます.XML layoutファイルはどこだ?およびレイアウトにコンポーネントを追加または削除Android開発者for Flutter(3)flutterでのアニメーションがどのように実現されるか、Canvas draw/paint Flutterでのローテーションマップ作成(2つの方法)CarouselSliderとPageView(自動ローテーション、手動で左右にドラッグすることも可能)flutterでtabbarを使用して上下を切り替えることができ、bannerローテーションマップ、listviewリフレッシュが追加されます.Listviewネストgridview Flutterプロジェクト作成サードパーティプラグインライブラリファイル導入、ローカルピクチャjsonデータ導入解析flutter run実行プロジェクトで発生した問題のまとめ(Scaffold加paddingおよびflutter/materil.dart’;ブレイク問題解決;listviewネストgridviewスライド問題)
もしよろしければ、startsを歓迎します.ありがとうございます.次は私が自分で書いたdemoを見て勉強することができます.
[プロジェクトソースgithub](https://github.com/1136346879/flutter-)
[Flutter中国語ネットに感謝します](https://flutterchina.club/technical-overview/)