Flutterの新しいナビゲーションおよびルーティングシステムの学習ICHI.PROFlutterの新しいナビゲーションおよびルーティングシステムの学習この記事では、どのようにフラッターの新しい説明NavigatorおよびRouterAPI作品を。Flutterのオープンデザインドキュメントに従うと、Navigator2.0およびRouterと呼ばれるこれらの新機能を見たことがあるかもしれません。これらのAPIを使用して、アプリの画面をより細かく制御できるようにする方法と、それを使用してルートを解析する方法について説明します。これらの新しいAPIは変更を壊すものではなく、単に新しい宣言型APIを追加するだけです。2.0より前は、複数のページをプッシュまたはポップしたり、現在のページの下にあるページを削除したりすることは困難でした。Navigator今日の動作に満足している場合は、同じ(必須の)方法で引き続き使用できます。Router基盤となるプラットフォームからのルートを処理し、適切なページを表示する機能を提供します。この記事ではRouter、ブラウザのURLを解析して適切なページを表示するように構成されています。2.0を使用してブラウザーのURLを解析し、アクティブなページのスタックを完全に制御する方法について説明します。この記事の演習では、プラットフォームからの着信ルートを処理し、アプリのページを管理するアプリを構築する方法を示します。次のGIFは、動作中のサンプルアプリを示しています。ナビゲーター1.0Flutterを使用している場合は、おそらくを使用してNavigatorおり、次の概念に精通しています。—Routeオブジェクトのスタックを管理するウィジェット。—Navigator画面を表すによって管理されるオブジェクトMaterialPageRoute。通常はのようなクラスによって実装されます。匿名ルートほとんどのモバイルアプリは、スタックのように画面を重ねて表示します。Flutterでは、これはを使用して簡単に実現できNavigatorます。MaterialAppそしてCupertinoApp、すでに使用Navigatorボンネットの下。使用してナビゲーターにアクセスするNavigator.of()か、を使用して新しい画面を表示しNavigator.push()、Navigator.pop():を使用して前の画面に戻ることができます。ときpush()に呼び出され、DetailScreenウィジェットはの上に配置されるHomeScreen。このようなウィジェット:前の画面(HomeScreen)はまだウィジェットツリーの一部であるため、それにState関連付けられているオブジェクトDetailScreenは表示されている間は残ります。名前付きルートFlutterは、またはのroutesパラメーターで定義されている名前付きルートもサポートしています。MaterialAppCupertinoAppこれらのルートは事前に定義する必要があります。名前付きルートに引数を渡すことはできますが、ルート自体から引数を解析することはできません。アプリがWebで実行されている場合、のようなルートからIDを解析することはできません/details/:id。onGenerateRouteを使用した高度な名前付きルート名前付きルートを処理するためのより柔軟な方法は、を使用することonGenerateRouteです。このAPIは、すべてのパスを処理する機能を提供します。完全な例は次のとおりです。ここに、settingsのインスタンスがありますRouteSettings。nameフィールドとargumentsフィールドは、Navigator.pushNamed呼び出されたときに提供された値、または何initialRouteに設定されているかです。URLなど)からのルートを解析する機能を提供するために、フレームワークに新しいクラスを追加します。新機能の概要は次のとおりです。—ナビゲーターの履歴スタックを設定するために使用される不変オブジェクト。Router—ナビゲーターによって表示されるページのリストを構成します。通常、このページのリストは、基盤となるプラットフォーム、またはアプリの状態の変化に基づいて変化します。RouteInformationParser、RouteInformationfromRouteInformationProviderを取得し、それをユーザー定義のデータ型に解析します。RouterDelegate—Routerアプリの状態の変化について学習する方法と、それらに応答する方法のアプリ固有の動作を定義します。その仕事は、RouteInformationParserとアプリの状態をリッスンし、Navigatorの現在のリストを使用してを構築することですPages。BackButtonDispatcher—戻るボタンの押下をに報告しますRouter。これらの部分がどのように相互作用するかの例を次に示します。2」)を発行すると、それをアプリで定義するRouteInformationParser抽象データ型T(たとえば、というクラス)に変換しますBooksRoutePath。RouterDelegateのsetNewRoutePathメソッドはこのデータ型で呼び出され、変更を反映するようにアプリケーションの状態を更新する必要があります(たとえば、を設定することによりselectedBookId)。notifyListeners.ときにnotifyListeners呼ばれて、それが伝えRouter再構築するRouterDelegate(その使用build()法)RouterDelegate.build()新しいを返しますNavigator。そのページには、アプリの状態への変更が反映されています(たとえば、selectedBookId)。2.0APIを使用した演習について説明します。次のGIFに示すように、URLバーとの同期を維持し、アプリとブラウザーからの戻るボタンの押下を処理できるアプリができあがります。沿って従うために、マスター・チャンネルへの切り替えは、ウェブサポートする新しいフラッタープロジェクトを作成し、内容置き換えるlib/main.dart以下とします:ページナビゲーターのpagesコンストラクターに新しい引数があります。Pageオブジェクトのリストが変更された場合、Navigator一致するようにルートのスタックを更新します。これがどのように機能するかを確認するために、本のリストを表示するアプリを作成します。_BooksAppState、本のリストと選択した本の2つの状態を保持します。次に、で_BooksAppState、オブジェクトのNavigatorリストを含むを返しPageます。keyページのforは、bookオブジェクトの値によって定義されることに注意してください。これは、オブジェクトが異なる場合、NavigatorこのMaterialPageオブジェクトが別のBookオブジェクトとは異なることを示しています。一意のキーがないと、フレームワークは異なる間の遷移アニメーションをいつ表示するかを決定できませんPages。注:必要に応じて、Page動作をカスタマイズするために拡張することもできます。このページはカスタム遷移アニメーションを追加します。最後に、コールバックpagesも提供せずに引数を提供するのはエラーonPopPageです。この関数は、が呼び出されるたびNavigator.pop()に呼び出されます。これは、状態(ページのリストを決定する)を更新するために使用する必要がありdidPop、ポップが成功したかどうかを判断するためにルートを呼び出す必要があります。didPopアプリの状態を更新する前に、失敗するかどうかを確認することが重要です。使用setStateすると、フレームワークにbuild()メソッドを呼び出すように通知されます。メソッドは、_selectedBookがnullの場合に単一ページのリストを返します。完全な例は次のとおりです。現状では、このアプリでは、ページのスタックを宣言的な方法で定義することしかできません。プラットフォームの戻るボタンを処理することができず、ナビゲートしてもブラウザのURLは変更されません。ルーターこれまでのところ、アプリはさまざまなページを表示できますが、たとえばユーザーがブラウザでURLを更新した場合など、基盤となるプラットフォームからのルートを処理できません。このセクションでのショーは、どのように実装するRouteInformationParser、RouterDelegateと、アプリの状態を更新します。セットアップが完了すると、アプリはブラウザのURLと同期したままになります。データ型RouteInformationParser我々はそれが最初に定義されますので、ユーザー定義のデータ型にルート情報を解析します。このアプリでは、アプリ内のすべてのルートを単一のクラスを使用して表すことができます。代わりに、スーパークラスを実装するさまざまなクラスを使用するか、別の方法でルート情報を管理することを選択できます。RouterDelegate次に、以下を拡張するクラスを追加しますRouterDelegate。定義されてRouterDelegateいるジェネリック型はですBookRoutePath。これには、表示するページを決定するために必要なすべての状態が含まれています。いくつかのロジックをからに移動_BooksAppStateしBookRouterDelegate、を作成する必要がありますGlobalKey。この例では、アプリの状態はに直接保存されますが、RouterDelegate別のクラスに分離することもできます。URLに正しいパスを表示するにBookRoutePathは、アプリの現在の状態に基づいてを返す必要があります。次に、のbuildメソッドは:RouterDelegateを返す必要がありますNavigator。onPopPageコールバックは現在、使用してnotifyListenersの代わりに、setStateこのクラスは今であることから、ChangeNotifierではなく、ウィジェット。currentConfiguration変更されており、そのことをbuildメソッドのニーズが呼び出されるために、再度新しいを構築しますNavigator。この_handleBookTappedメソッドnotifyListenersは、setState次の代わりに使用する必要もあります。新しいルートがアプリケーションにプッシュされるRouterとsetNewRoutePath、を呼び出します。これにより、ルートの変更に基づいてアプリの状態を更新する機会がアプリに与えられます。RouteInformationParserRouteInformationParser着信ルートを(解析するフックを提供するRouteInformation)とタイプ(ユーザー定義に変換BookRoutePath)。Uriクラスを使用して解析を処理します。この実装はこのアプリに固有のものであり、一般的なルート解析ソリューションではありません。これについては後で詳しく説明します。これらの新しいクラスを使用するには、新しいMaterialApp.routerコンストラクターを使用して、カスタム実装を渡します。完全な例は次のとおりです。このサンプルをChromeで実行すると、ナビゲート中のルートが表示され、URLを手動で編集すると正しいページにナビゲートされます。TransitionDelegateTransitionDelegateページのリストが変更されたときにルートが画面に表示される(または画面から削除される)方法をカスタマイズするカスタム実装を提供できます。これをカスタマイズする必要がある場合は読み進めてください。デフォルトの動作に満足している場合は、このセクションをスキップできます。目的の動作を定義するカスタムTransitionDelegateをに提供しNavigatorます。次の実装では、すべての遷移アニメーションが無効になります。このカスタム実装resolve(は、さまざまなルートをプッシュ、ポップ、追加、完了、または削除のいずれかとしてマークすることを担当する)をオーバーライドします。—アニメーション化されたトランジションでルートを表示しますmarkForAdd—アニメーション化されたトランジションなしでルートを表示しますmarkForPop—アニメーション化されたトランジションでルートを削除し、結果でルートを完成させます。このコンテキストでの「完了」とは、resultオブジェクトがのonPopPageコールバックに渡されることを意味しますAppRouterDelegate。—アニメーション化されたトランジションがなく、完了していないルートを削除します。この例のしくみ:この例では、新しいルートと画面を終了するルートの両方を確認します。内のすべてのオブジェクトを調べ、newPageRouteHistoryを使用して遷移アニメーションなしで追加するようにマークしますmarkForAdd。次に、locationToExitingPageRouteマップの値をループします。してマークされたルートが見つかった場合は、トランジションなしで完了せずにルートを削除する必要があることを示すisWaitingForExitingDecisionために呼び出しますmarkForRemove。これが完全なサンプル(要点)です。ネストされたルーターこの大きなデモは、Router別の内にを追加する方法を示していますRouter。多くのアプリでは、内の宛先BottomAppBarへのルートと、その上のビューのスタックへのルートが必要です。これには、2つのナビゲーターが必要です。これを行うために、アプリはアプリケーション状態オブジェクトを使用して、アプリ固有のナビゲーション状態(選択されたメニューインデックスと選択されたBookオブジェクト)を保存します。この例Routerは、戻るボタンを処理する方法を構成する方法も示しています。ネストルーターサンプル(要点)次は何ですかこの記事では、特定のアプリでこれらのAPIを使用する方法について説明しましたが、より高レベルのAPIパッケージを構築するためにも使用できます。これらの機能の上に構築された高レベルのAPIがユーザーに何ができるかを探求するために、ぜひご参加ください。アプリに最適なプログラミング言語を選択する方法モバイル開発は、企業が今日のデジタル世界で成功するための重要な要素となっています。アプリの開発者として、アプリを構築するための適切なプログラミング言語を選択することが不可欠です。優れたフレームワークです。プレーヤー、または単にスパム電話を受けている人である可能性があります。広告で見た番号を確認しようとしている人。赤髪の少女単独公演ヘイデンからの依頼で、ケイティは自分のオナニーを撮影する。一緒に過ごした夜を終え、ヘイデンがケイティを大学の寮に車で送ったのは真夜中過ぎだった。彼女は朝早くから授業があり、前夜彼と一緒にいた後、着替えを持っていませんでした。資金を提供する取り組みの中心です。来年の資金がどこに流れるかの指針となるよう、さまざまな議会事務所に要望書を提出しています。古いものは再び新しくなり、以前はキラキラ輝いていたものがくすんで見えます。年代後半の他のファッションとともにダウンタウンのクールな子供たちの間で復活したことについて話しているのではありません。