새로운 경로를 엽니 다
TipRoute 들어오는 텍스트에 대한 책임, 매개 변수 프롬프트 텍스트를 취하는 경로를 생성 우리는 "뒤로"버튼을 추가 TipRoute 또한, 반환 매개 변수를 가져올 것이다 동시에 경로의 반환을 클릭, 페이지에 표시
import 'package:flutter/material.dart'; //导包
//应用入口
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: '我是标题',
theme: ThemeData(
primarySwatch: Colors.blue,//蓝色主题
),
home: MyHomePage(title: '我是HomePager标题名字'),
);
}
}
//首页,继承自有状态组件
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'点击进行累加~',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
FlatButton(
child: Text("打开新的路由"),
textColor: Colors.blue,
onPressed: (){
//导航到新的路由
Navigator.push(context,MaterialPageRoute(builder: (context){
return NewRoute();
}));
},
),
FlatButton(
child: Text("打开新的路由2"),
textColor: Colors.amber,
onPressed: (){
//导航到第二个路由
Navigator.push(context, MaterialPageRoute(builder: (context){
return NewRoute2();
}));
},
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
class NewRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.green,
title: Text("new Route"),
),
body: Center(
child: Text("This is new Route"),
),
);
}
}
class NewRoute2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.red,
title: Text("第二个页面"),
),
body: Center(
child: Text("第二个页面的内容"),
),
);
}
}
MaterialPageRoute
MaterialPageRoute({
WidgetBuilder builder,
RouteSettings settings,
bool maintainState = true,
bool fullscreenDialog = false,
})
builder
유형 콜백 함수입니다 WidgetBuilder, 그 역할은 빌드 특정 콘텐츠에 대한 경로 페이지 인 경우, 반환 값은 위젯입니다. 우리는 일반적으로이 콜백 반환에게 새로운 경로의 인스턴스를 달성하고자합니다.settings
이러한 경로 이름으로 라우팅 구성 정보를 포함합니다 초기 라우팅 (홈) 경우.maintainState
: 당신이 쓸모없는 라우팅시 점유하는 모든 리소스를 해제 할 경우 새 라우팅 스택이 원래 경로가 여전히 메모리에 저장됩니다 기본적으로, 그것은 설정할 수 있습니다maintainState
false로.fullscreenDialog
이 페이지는 새로운 경로 경우 전체 화면 모달 대화, 아이폰 OS에 있는지 여부를 나타내는fullscreenDialog
이며true
, 새 페이지는 (오히려 수평보다) 화면의 바닥에서 미끄러됩니다가.
항해자
두 가지 방법 :
미래 푸시 (BuildContext 컨텍스트 루트 경로)
라우팅 스택 (즉, 새로운 페이지를 열), 리턴 값은 감안할 Future
대상 데이터 스택 (즉, 닫힘)를 수용하기위한 새로운 경로를 반환한다.
불리언 팝 (BuildContext 콘텍스트 [결과])
라우팅 스택 (즉, 새로운 페이지를 열), 리턴 값은 감안할 Future
대상 데이터 스택 (즉, 닫힘)를 수용하기위한 새로운 경로를 반환한다.
실행 순서를 라우팅 네비게이터 initialRoute를 찾고 -> onGenerateRoute -> onUnknownRoute
라우팅 스택 (즉, 새로운 페이지를 열), 리턴 값은 감안할 Future
대상 데이터 스택 (즉, 닫힘)를 수용하기위한 새로운 경로를 반환한다.
Navigator.push (BuildContext 컨텍스트 루트 경로) 等价 于 Navigator.of (컨텍스트) .push (루트 경로)
값을 기준으로 경로
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "页面1",
theme: ThemeData(
primarySwatch: Colors.red,
),
home: Scaffold(
appBar: AppBar(
title: Text("页面1"),
),
body: GiveRoute(),
),
);
}
}
class GiveRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: RaisedButton(
onPressed: () async {
//打开新页面,并且等待返回结果
var result = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return TipRoute(
text: "我是传递给TipRoute的文本",
);
},
),
);
print("路由的返回数据为$result");
},
child: Text("打开提示页面"),
),
);
}
}
/**
* 返回数据的
*/
class TipRoute extends StatelessWidget {
final String text;
TipRoute({Key key, @required this.text}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("提示信息"),
),
body: Padding(
padding: EdgeInsets.all(18),
child: Column(
children: <Widget>[
Text(text),
RaisedButton(
onPressed: () => Navigator.pop(context, "我是返回值"),
child: Text("返回"),
),
],
),
),
);
}
}
패스 경로에 2 함수 값을 구성하여
Navigator.pop에 의해 두 번째 경로 (문맥, "나는 반환 값입니다"), 라우트의 전통적 가치로 돌아가
경로는 먼저 다음 코드로받을
return Center(
child: RaisedButton(
onPressed: () async {
//打开新页面,并且等待返回结果
var result = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return TipRoute(
text: "我是传递给TipRoute的文本",
);
},
),
);
print("路由的返回数据为$result");
},
child: Text("打开提示页面"),
),
);
명명 된 경로
경로의 이름 (경로 명명 된) "명명 된 경로"
라우팅 테이블
응용 프로그램이되는 구성 요소를 라우팅하는 이름의 대응을 알 수 있도록라는 이름의 경로를 사용하려면, 우리는 먼저, 등록 및 라우팅 테이블 (라우팅 테이블)을 제공해야합니다. 사실, 라우팅 테이블을 정의하는 라우팅 테이블로 다음되고, 경로에 이름을 등록 :
Map<String, WidgetBuilder> routes;
그것은 인 Map
문자열 인 경로를 들어, 키 이름, 값 A는 builder
대응하는 라우팅 위젯을 생성하기위한 콜백 함수.
에 대응 라우팅 테이블 이름으로 검색 라우팅 WidgetBuilder
콜백 함수, 다음 콜백 함수 세대 위젯 및 반환 경로를 호출합니다.
라는 이름의 경로를 사용하여
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "路由表 - 命名路由",
theme: ThemeData(
primarySwatch: Colors.amber,
),
routes: {
"/": (context) => HomeDemo(title: "主页"), //使用命名路由 注册首页路由
"new_page1": (context) => PageRoutes1(),
"new_page2": (context) => PageRoutes2(),
},
);
}
}
class HomeDemo extends StatelessWidget {
String title;
HomeDemo({Key key, @required this.title}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("主页"),
),
body: Center(
child: Column(
children: <Widget>[
RaisedButton(
onPressed: () {
Navigator.pushNamed(context, "new_page1");
},
child: Text("通过命名路由方式跳转到page1"),
),
RaisedButton(
onPressed: () {
Navigator.pushNamed(context, "new_page2");
},
child: Text("通过命名路由方式跳转到page2"),
),
],
),
),
);
}
}
class PageRoutes1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("页面一"),
),
);
}
}
class PageRoutes2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("页面二"),
),
);
}
}
라우팅 레지스트리 홈 이름을 지정하여
routes: {
"/": (context) => HomeDemo(title: "主页"), //使用命名路由 注册首页路由
"new_page1": (context) => PageRoutes1(),
"new_page2": (context) => PageRoutes2(),
},
명명 된 노선들은 매개 변수를 전달
import 'package:first_flutter_app/main.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "命名路由传递参数",
theme: ThemeData(
primarySwatch: Colors.blue,
),
routes: {
"/": (context) => HomeDemo(),
"newpage": (context) => NewPageRoute(),
},
);
}
}
class HomeDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("命名路由传递参数"),
backgroundColor: Colors.amberAccent,
),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.of(context).pushNamed("newpage", arguments: "项目ID1234");
},
child: Text("命名路由 传递函数"),
),
),
);
}
}
class NewPageRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
var args = ModalRoute.of(context).settings.arguments;
return Scaffold(
appBar: AppBar(
title: Text("NewPageRoute"),
backgroundColor: Colors.amberAccent,
),
body: Center(
child: Text("命名路由接受到的参数:$args"),
),
);
}
}
어떤이 이름을 지정하지 않고 건설 구조를 라우팅하는
import 'package:first_flutter_app/main.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "命名路由传递参数",
theme: ThemeData(
primarySwatch: Colors.blue,
),
routes: {
"/": (context) => HomeDemo(),
"newpage": (context) => NewPageRoute(), //无构造的
"tiproute": (context) =>
TipRoute(text: ModalRoute.of(context).settings.arguments), //有构造的
},
);
}
}
class HomeDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("命名路由传递参数"),
backgroundColor: Colors.amberAccent,
),
body: Center(
child: Column(
children: <Widget>[
RaisedButton(
onPressed: () {
Navigator.of(context)
.pushNamed("newpage", arguments: "项目ID1234");
},
child: Text("命名路由无构造的 传递函数"),
),
RaisedButton(
onPressed: () {
Navigator.of(context)
.pushNamed("tiproute", arguments: "你好,我是flutter命名函数传值");
},
child: Text("命名路由有构造的 传递函数"),
)
],
),
),
);
}
}
/**
* 无构造的
*/
class NewPageRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
var args = ModalRoute.of(context).settings.arguments;//本行是接受参数
return Scaffold(
appBar: AppBar(
title: Text("NewPageRoute"),
backgroundColor: Colors.amberAccent,
),
body: Center(
child: Text("命名路由接受到的参数:$args"),
),
);
}
}
/**
* 有构造的
*/
class TipRoute extends StatelessWidget {
final String text; //用来接受传过来的信息
TipRoute({Key key, @required this.text}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("提示信息"),
),
body: Padding(
padding: EdgeInsets.all(18),
child: Column(
children: <Widget>[
Text(text),
RaisedButton(
onPressed: () => Navigator.pop(context, "我是返回值"),
child: Text("返回"),
),
],
),
),
);
}
}
경로 생성 후크
바이 onGenerateRoute()
컴포넌트에 함수 파라미터 추출 및 패스 파라미터
사용자가 등을 저장, 상품의 정보를 볼 수에 기록되지만 트랜잭션 후, 카트 쇼핑, 사용자의 개인 정보와 다른 페이지가 시계에 로그인 할 필요가있는 전기 공급 업체 APP의 개발. 위의 기능을 달성하기 위해, 우리는 각 페이지를 라우팅하기 전에 열려있는 상태에서 사용자가 로그인을 결정해야합니다! 우리 전에 모든 경로 연중 필요성은 매우 귀찮은 일 무슨 결정합니다.
MaterialApp는이 명명 된 경로를 열 때 호출 할 수 있습니다하는 onGenerateRoute 속성이
당신이 Navigator.pushNamed를 호출 할 때 (...) 경우 명명 된 경로를 열 수 있기 때문에 그 이유는 이유있다 , 지정된 경로 이름이 이미 라우팅 테이블에 등록되어 테이블 빌더를 라우팅하는 구성 요소 호출을 라우팅 생성하는 기능을합니다, 라우팅 테이블 경우 그것은 onGenerateRoute를 호출, 등록되지 않은 경로를 생성 할 수 있습니다.
onGenerateRoute
서명 콜백은 다음과 같습니다 :
Route<dynamic> Function(RouteSettings settings)
MaterialApp(
... //省略无关代码
onGenerateRoute:(RouteSettings settings){
return MaterialPageRoute(builder: (context){
String routeName = settings.name;
// 如果访问的路由页需要登录,但当前未登录,则直接返回登录页路由,
// 引导用户登录;其它情况则正常打开路由。
}
);
}
);