PS:1つのことをしたいのは簡単ですが、実際に1つのことをするのは非常に困難です。
同じシリーズの記事は次のとおりです。
- Flutterシリーズのナビゲーターの使用に関する詳細な説明
- Flutterシリーズのフレックスレイアウトの詳細な説明
- Flutterシリーズでの画像読み込みの詳細な説明
- Flutterシリーズのウィジェットライフサイクル
- 混合開発Android記事のFlutterシリーズ
- Flutterシリーズのプラットフォームチャネルの使用に関する詳細な説明
ナビゲーターはスタックルールを使用してウィジェットを管理し、ナビゲーターはページアクセスレコードを記録し、ナビゲーターはページ間のジャンプ操作を完了するために使用できます。
Android開発では、通常参照されるジャンプは、ページジャンプとも呼ばれるアクティビティジャンプです。Fluterでは、すべてルートジャンプを参照します。AndroidのページはFlutterのルートに対応します。ナビゲーターは、ルートオブジェクトスタックの管理を担当します。 、およびNavigator.pushやNavigator.popなどのスタックを管理するためのメソッドを提供します。
上記のように、FlutterはRouteをスタックにプッシュしてRouteをアンスタックするメソッドを提供します。Androidの一部のデバイスにはリターンキーがあります。このリターンキーはFlutterのNavigator.pushおよびNavigator.popメソッドと互換性があります。一部のデバイスに対応するものがない場合リターンキー、AppBarにあります。Scaffoldにリターンボタンを追加します。Scaffoldにリターンボタンが追加されました。トリガーされると、Navigator.pop操作が呼び出されます。この記事の内容は次のとおりです。
- 基本的なルートナビゲーション
- ルートパラメータの受け渡し
- その他のルートナビゲーション
基本的なルートナビゲーション
前述のように、Flutterはスタックを使用してウィジェットを管理します。スタックとポップのメソッドはNavigator.pushとNavigator.popです。これら2つのメソッドは、ページ間のジャンプとロールバック操作を完了するために使用されます。
Navigator.push
Navigator.pushは、ルートのプッシュ操作を実行するために使用され、指定されたルートを介して対応するページにジャンプできます。方法は次のとおりです。
/// 参数:(上下文,具体路由)
static Future<T> push<T extends Object>(BuildContext context, Route<T> route) {
return Navigator.of(context).push(route);
}
MaterialPageRouteを使用して、対応するページのルートを作成します。使用法は次のとおりです。
// 跳转到NavigatorPushPopPage
_navigateToPage(context, NavigatorPushPopPage());
/// Navigator.push
/// 页面跳转
_navigateToPage(BuildContext context, Widget widget) {
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) {
return widget;
}));
}
Navigator.pop
Navigator.popは、ルートのアンスタック操作、つまりページロールバックを実行するために使用されます。オプションのパラメーター結果は、ページが戻ったときに運ばれるパラメーターとして追加できます。方法は次のとおりです。
/// 参数:(上下文,返回时携带的参数(可选参数))
static bool pop<T extends Object>(BuildContext context, [ T result ]) {
return Navigator.of(context).pop<T>(result);
}
次のように、IconButtonをクリックして現在のページを終了します。
IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () => Navigator.pop(context)),
Navigator.pushnamed
Navigator.pushnamedは、指定されたルートのスタック操作を実行するために使用されます。次のように、オプションの引数を介してパラメーターを渡すことができます。
/// 参数:(上下文,路由名称,携带的参数(可选参数))
static Future<T> pushNamed<T extends Object>(
BuildContext context,
String routeName, {
Object arguments,
}) {
return Navigator.of(context).pushNamed<T>(routeName, arguments: arguments);
}
を使用する場合は、最初に対応するルート名をMaterialAppのルーティングテーブルroutesに追加します。コードリファレンスは次のとおりです。
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomePage(),
routes: <String, WidgetBuilder>{
// 对应路由/NavigatorPushNamedPage
NavigatorPushNamedPage.routeName: (BuildContext context) =>
NavigatorPushNamedPage(),
},
);
}
}
/// page
/// Navigator.pushNamed
/// 使用已命名路由
class NavigatorPushNamedPage extends StatelessWidget {
static final routeName = '/NavigatorPushNamedPage';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Navigator.pushNamed"),
centerTitle: true,
),
body: Center(
child: Text(
"Navigator.pushNamed",
style: TextStyle(fontSize: 18),
),
),
);
}
}
次に、次のように、Navigator.pushNamedを使用してページNavigatorPushNamedPageにジャンプできます。
// 跳转到NavigatorPushNamedPage
_navigatePushNamedPage(context, NavigatorPushNamedPage.routeName);
/// Navigator.pushNamed
/// 页面跳转
_navigatePushNamedPage(BuildContext context, String routeName,
[Object arguments]) {
Navigator.pushNamed(context, routeName, arguments: arguments);
}
上記はFlutterの最も基本的なページナビゲーションメソッドです。Navigator.pushまたはNavigator.pushNamedのどちらであっても、NavigatorStateのpushメソッドに基づいて実装されます。NavigatorStateは、特定のBuildContextを介してNavigator.of(context)によって取得されます。 NavigatorStateのpushメソッドは次のとおりです。
/// NavigatorState.push
Future<T> push<T extends Object>(Route<T> route) {
assert(!_debugLocked);
assert(() { _debugLocked = true; return true; }());
assert(route != null);
assert(route._navigator == null);
final Route<dynamic> oldRoute = _history.isNotEmpty ? _history.last : null;
route._navigator = this;
route.install(_currentOverlayEntry);
_history.add(route);
route.didPush();
route.didChangeNext(null);
if (oldRoute != null) {
oldRoute.didChangeNext(route);
route.didChangePrevious(oldRoute);
}
for (NavigatorObserver observer in widget.observers)
observer.didPush(route, oldRoute);
RouteNotificationMessages.maybeNotifyRouteChange(_routePushedMethod, route, oldRoute);
assert(() { _debugLocked = false; return true; }());
_afterNavigation(route);
return route.popped;
}
以下では、ページがジャンプしたときのパラメーターの転送や、ページのロールバックがパラメーターの転送であることなど、Fluterでのパラメーターの転送について説明します。
ルートパラメータの受け渡し
ページジャンププロセスで渡されるパラメータには、ページがジャンプするときのパラメータの伝達と、ページがロールバックされるときのパラメータの伝達が含まれます。
Navigator.pushはパラメータを運びます
Navigator.pushを使用して、ページにジャンプするパラメーターを伝達します。パラメーターは、対応するページ構築方法を介して受信されます。具体的な使用法は次のとおりです。
/// 跳转到NavigatorPushWithParamPage
_navigateToPage(context,
NavigatorPushWithParamPage(
param: "this info from last page!",
));
/// Navigator.push/pop
/// 页面跳转
_navigateToPage(BuildContext context, Widget widget) {
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) {
return widget;
}));
}
/// page
/// Navigator.push携带参数
class NavigatorPushWithParamPage extends StatelessWidget {
// 参数
final String param;
NavigatorPushWithParamPage({
this.param,
});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Navigator.push携带参数"),
centerTitle: true,
),
body: Center(
child: Text(
"arguments:${this.param}",
style: TextStyle(fontSize: 18),
),
),
);
}
}
Navigator.pushNamedはパラメータを運びます
上記から、Navigator.pushNamed(context、routrName、{arguments})メソッドパラメーターのオプションパラメーターは、ジャンプによって運ばれるパラメーターであることがわかります。まず、MaterialAppの下のonGenerateRouteの引数を介して渡されたパラメーターを受け取ります。 、 次のように:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomePage(),
// 参数接收
onGenerateRoute: (RouteSettings settings) {
if (settings.name == NavigatorPushNamedWithParamPage.routeName) {
return MaterialPageRoute<String>(builder: (BuildContext context) {
return NavigatorPushNamedWithParamPage(settings.arguments);
});
}else{
return null;
}
},
);
}
}
次に、Navigator.pushNamedを使用してページにジャンプします。パラメーターは、対応するページ構築メソッドによって引き続き受信されます。以下を参照してください。
/// 跳转到NavigatorPushNamedWithParamPage
_navigatePushNamedPage(
context,
NavigatorPushNamedWithParamPage.routeName,
"this info from last page!");
/// Navigator.pushNamed携带参数
_navigatePushNamedPage(BuildContext context, String routeName,
[Object arguments]) {
Navigator.pushNamed(context, routeName, arguments: arguments);
}
/// page
/// Navigator.pushNamed携带参数
/// 使用已命名路由
class NavigatorPushNamedWithParamPage extends StatelessWidget {
static final String routeName = '/NavigatorPushNamedWithParamPage';
final String info;
NavigatorPushNamedWithParamPage(this.info);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text("Navigator.pushNamed携带参数"),
centerTitle: true,
),
body: Center(
child: Text(
"arguments:${this.info}",
style: TextStyle(fontSize: 18),
),
),
),
);
}
}
ページが戻ったときにパラメータを実行する
上記から、Navigator.pop(context、[result])メソッドパラメーターのオプションのパラメーターresultは、ページがロールバックされたときに運ばれるパラメーターであることがわかります。Navigator.pushは、Futureを返し、結果を処理します。 thenステートメントのページロールバック。使用リファレンスは次のとおりです。
/// 跳转到NavigatorPopWithParamPage
_navigatePopWithParamPage(context, NavigatorPopWithParamPage());
/// Navigator.pop返回时携带参数
_navigatePopWithParamPage(BuildContext context, Widget widget) {
Navigator.push<String>(context,
MaterialPageRoute(builder: (BuildContext context) {
return widget;
})).then((result) {
// 返回时携带参数处理
Toast.show("Navigator.pop返回时携带参数:" + result, context);
});
}
/// page
/// Navigator.pop返回时携带参数
class NavigatorPopWithParamPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return WillPopScope(
child: Scaffold(
appBar: AppBar(
title: Text("Navigator.pop返回时携带参数"),
centerTitle: true,
),
body: Center(
child: Text(
"Navigator.pop返回时携带参数",
style: TextStyle(fontSize: 18),
),
),
),
onWillPop: () => _popBack(context));
}
/// 页面返回并设置返回参数,类似Android中的setResult方法
_setResult(BuildContext context) {
Navigator.pop(context, "this message from NavigatorPopWithParamPage!");
}
/// 统一处理返回键
Future<bool> _popBack(BuildContext context) {
_setResult(context);
return Future.value(false);
}
}
その他のルートナビゲーション
その他の一般的に使用されるルーティングナビゲーション方法は次のとおりです。
// 从Navigator中移除当前所在路由再跳转到新的路由,相当于finish再startActivity
Navigator.popAndPushNamed
// 根据指定的Route直接返回,在此之前的路由会被清除
Navigator.popUntil
// 跳转到新的Route,并将指定Route之前的的Route清空,pushNamedAndRemoveUntil与之类似
Navigator.pushAndRemoveUntil
// 页面替换,pushReplacementNamed与之类似
Navigator.pushReplacement
ルーティングに関連する他の操作方法は1つずつリストされていません。関連するAPIを確認できます。