В этой статье рассматриваются некоторые не-Flutterstable
Версия(2019年2月25日 为止)
, вы можете проверить соответствующие документы Flutter, чтобы проверить, синхронизированы ли новые функции.stable
разветвление или переключение других ветвей (например,master
) опыт
введение
Когда мы используем Flutter для разработки приложений, маршрутизация является обязательной.
Flutter предоставляет два способа маршрутизации, а именноNavigator.push()
(пример) так же какNavigator.pushNamed()
(пример).
У каждого из этих двух методов есть преимущества и недостатки:
- Navigator.push()
- Преимущества: динамичность и большая степень свободы, возможность переходить на новые страницы различными способами анимации и передавать параметры новым страницам.
- Недостатки: это приведет к избыточности кода и неудобно для обслуживания кода. (конечно можно инкапсулировать, здесь это не обсуждается)
- Navigator.pushNamed()
- Преимущества: переход между страницами может быть выполнен одним предложением, подобно тому, как это делается в большинстве современных фреймворков.
- Недостаток: нельзя передавать параметры! Параметры не могут быть переданы! Параметры не могут быть переданы!
выберите
В реальной разработке и применении мы также более склонныNamed
метод маршрутизации.
Но единственным недостатком является то, что он не поддерживает передачу параметров, что действительно бесит.
На самом деле этот вопрос поднимался в Flutter’s Issues уже 16 лет, но этоIssueдо этого годаPRОтправлено(目前为止这个功能仅仅被合并进master分支并没有同步到bate或者stable)
Начать
- Сначала мы должны перейти к основной ветке
воплощать в жизнь
flutter channel master
а затем запустите командуflutter upgrade
Убедитесь, что вы используете последнюю версию. Вы можете переключиться на основную ветку
- Создайте проект на флаттере
- мы здесь
main.dart
слегка модифицированный
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatelessWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(this.title),
),
body: Center(
child: GestureDetector(
onTap: (){
// TODO
},
child: Text("go next page with params"),
),
),
);
}
}
- Добавить вторую страницу
page.dart
import 'package:flutter/material.dart';
class Page extends StatelessWidget{
@override
Widget build(BuildContext context) {
return Material(
child: Center(
child: Text("hi this is next page"),
),
);
}
}
- Добавить маршрут и перейти при передаче параметров
main.dart
import 'package:flutter/material.dart';
// 引入新页面
import 'page.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
// 处理Named页面跳转 传递参数
onGenerateRoute: (RouteSettings setting) {
if(setting.name == '/page') {
return MaterialPageRoute(builder: (context) => Page(id: setting.arguments['id']));
}
},
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatelessWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(this.title),
),
body: Center(
child: GestureDetector(
onTap: (){
// 进行Named页面跳转 传递参数
Navigator.pushNamed(context, '/page', arguments: { "id": 1} );
},
child: Text("go next page with params"),
),
),
);
}
}
- Страница принимает параметры
page.dart
import 'package:flutter/material.dart';
class Page extends StatelessWidget{
Page({this.id});
final int id;
@override
Widget build(BuildContext context) {
return Material(
child: Center(
child: Text("hi this is next page, id is $id"),
),
);
}
}
Эффект
оптимизация
Здесь мы все ещеonGenerateRoute
Чтобы справиться с нашим именованным прыжком, мы оптимизируем его.
(На данный момент нет возможности его обработать в роутах MaterialApp, причина видна в исходниках (один)(два))
Исходный код один: вызов
widget.pageRouteBuilder
и пройти вsettings
(arguments
существуетsettings
середина)Исходный код два:
pageRouteBuilder
жестко запрограммирован для созданияMaterialPageRoute
,а такжеMaterialPageRoute
не является правильнымsettings
пройтипоэтому мы можем только
onGenerateRoute
обработано в.(Надеюсь, официальный сайт можно будет и дальше оптимизировать, эмммм, подождем и увидим)
/**
* main.dart
*/
import 'package:flutter/material.dart';
// 引入新页面
import 'page.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// 定义路由信息
final Map<String, Function> routes = {
'/page': (context, {arguments}) => Page(arguments: arguments)
};
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
// 处理Named页面跳转 传递参数
onGenerateRoute: (RouteSettings settings) {
// 统一处理
final String name = settings.name;
final Function pageContentBuilder = this.routes[name];
if (pageContentBuilder != null) {
final Route route = MaterialPageRoute(
builder: (context) =>
pageContentBuilder(context, arguments: settings.arguments));
return route;
}
},
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatelessWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(this.title),
),
body: Center(
child: GestureDetector(
onTap: () {
// 进行Named页面跳转 传递参数
Navigator.pushNamed(context, '/page', arguments: {'id': 123});
},
child: Text("go next page with params"),
),
),
);
}
}
/**
* page.dart
*/
import 'package:flutter/material.dart';
class Page extends StatelessWidget{
Page({this.arguments});
final Map arguments;
@override
Widget build(BuildContext context) {
return Material(
child: Center(
child: Text("hi this is next page, id is ${arguments != null ? arguments['id'] : '0'}"),
),
);
}
}