精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網(wǎng)站建設(shè)資訊

NEWS

網(wǎng)站建設(shè)資訊

Flutter利用注解生成可自定義的路由的實(shí)現(xiàn)

route_generator是什么

創(chuàng)新互聯(lián)公司10多年成都定制網(wǎng)頁設(shè)計(jì)服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計(jì)及高端網(wǎng)站定制服務(wù),成都定制網(wǎng)頁設(shè)計(jì)及推廣,對房屋鑒定等多個(gè)方面擁有豐富的網(wǎng)站運(yùn)維經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。

這是一個(gè)簡單的 Flutter 路由生成庫,只需要少量的代碼,然后利用注解配合源代碼生成,自動(dòng)生成路由表,省去手工管理路由代碼的煩惱。

特性

  • 自定義路由名稱
  • 自定義路由動(dòng)畫
  • 自定義路由參數(shù)
  • 自定義路由邏輯

依賴

dependencies:
 # Your other regular dependencies here
 route_annotation: ^0.1.0

dev_dependencies:
 # Your other dev_dependencies here
 build_runner: ^1.5.0
 route_generator: ^0.1.2

生成代碼

單次構(gòu)建

在項(xiàng)目根目錄中運(yùn)行flutter pub run build_runner build,可以在需要時(shí)為項(xiàng)目生成路由代碼。這會(huì)觸發(fā)一次性構(gòu)建,該構(gòu)建遍歷源文件,選擇相關(guān)文件,并為它們生成必要的路由代碼。雖然這很方便,但如果您不必每次在模型類中進(jìn)行更改時(shí)都必須手動(dòng)構(gòu)建,那么你可以選擇持續(xù)構(gòu)建。

持續(xù)構(gòu)建

在項(xiàng)目根目錄中運(yùn)行flutter pub run build_runner watch來啟動(dòng)watcher,它可以使我們的源代碼生成過程更加方便。它會(huì)監(jiān)視項(xiàng)目文件中的更改,并在需要時(shí)自動(dòng)構(gòu)建必要的文件。

route_annotation

annotationdescription
Router此注解用來標(biāo)志某個(gè)為 Flutter App 的類,并以此生成相應(yīng)的路由代碼
RoutePage此注解用來注解一個(gè)路由頁面
RouteParameter一個(gè)用來標(biāo)志頁面參數(shù)的注解,只為可選參數(shù)設(shè)計(jì)。用于 RoutePage 。
RouteField此注解用來標(biāo)志一個(gè)完全自定義的路由,被注解的對象必須作為路由頁面類靜態(tài)字段
PageRouteBuilderFuntcion這個(gè)注解用來標(biāo)識(shí)一個(gè)路由頁面的 RouteFactory 靜態(tài)方法
RoutePageBuilderFunction這個(gè)注解用來標(biāo)識(shí)一個(gè)路由頁面的 RoutePageBuilder靜態(tài)方法
RouteTransitionBuilderFunction這個(gè)注解用來標(biāo)識(shí)一個(gè)路由頁面的 TransitionBuilder 靜態(tài)方法
RouteTransitionDurationField這個(gè)注解用來標(biāo)識(shí)一個(gè)自定義路由頁面的過渡時(shí)長

代碼示例

定義路由 App

@Router()
class DemoApp extends StatefulWidget {
 @override
 _DemoAppState createState() => _DemoAppState();
}

class _DemoAppState extends State {
 @override
 Widget build(BuildContext context) {
  return MaterialApp(
   initialRoute: "/",
   onGenerateRoute: onGenerateRoute,
  );
 }
}

定義路由頁面

// isInitialRoute為true表示它將作為initial page
@RoutePage(isInitialRoute: true)
class HomePage extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
  return Scaffold();
 }
}

定義路由頁面參數(shù)

對于單個(gè)參數(shù)

@RoutePage(params: [RouteParameter("title")])
class OneArgumentPage extends StatelessWidget {
 final String title;

 const OneArgumentPage({Key key, this.title}) : super(key: key);

 @override
 Widget build(BuildContext context) {
  return Container();
 }
}

導(dǎo)航

Navigator.of(context).pushNamed(
 ROUTE_ONE_ARGUMENT_PAGE,
 arguments: "title is empty",
);

注意事項(xiàng):

對于單個(gè)參數(shù)的路由,利用Navigator進(jìn)行導(dǎo)航的時(shí)候arguments即為原始參數(shù)。

對于多個(gè)參數(shù)

@RoutePage(params: [RouteParameter("title"), RouteParameter("subTitle")])
class TwoArgumentPage extends StatelessWidget {
 final String title;
 final String subTitle;

 TwoArgumentPage({this.title, Key key, this.subTitle}) : super(key: key);

 @override
 Widget build(BuildContext context) {
  return Scaffold();
 }
}

導(dǎo)航

Navigator.of(context).pushNamed(
 ROUTE_TWO_ARGUMENT_PAGE,
 arguments: {
  "title": _titleController.text.isNotEmpty
    ? _titleController.text
    : "title is empty",
  "subTitle": _subTitleController.text.isNotEmpty
    ? _subTitleController.text
    : "sub title is empty",
 },
);

注意事項(xiàng):

對于多個(gè)參數(shù)的路由,利用Navigator進(jìn)行導(dǎo)航的時(shí)候arguments必須為Map

如果你不需要自定義路由,以下部分,你可以什么都不用添加,就讓route_generator為你自動(dòng)生成相關(guān)代碼吧!

自定義路由(優(yōu)先級(jí):3)

這種方法自定義路由的優(yōu)先級(jí)最高,如果同時(shí)存在多種自定義路由選擇,該種方案最先被選擇。

@RoutePage()
class CustomRoutePage extends StatelessWidget {
 @RouteField()
 static Map route = {
  'custom_route': (RouteSettings settings) =>
    MaterialPageRoute(builder: (BuildContext context) => CustomRoutePage()),
  'alias_route': (RouteSettings settings) => PageRouteBuilder(
     pageBuilder: (BuildContext context, Animation animation,
         Animation secondaryAnimation) =>
       CustomRoutePage(),
    ),
 };

 ...

}

它會(huì)生成如下代碼:

Map _customRoutePage = CustomRoutePage.route;

自定義路由(優(yōu)先級(jí):2)

這種方法自定義路由的優(yōu)先級(jí)較低,如果同時(shí)存在多種自定義路由選擇,則按優(yōu)先級(jí)從大到小選擇。

@RoutePage()
class CustomRoutePage extends StatelessWidget {
 @PageRouteBuilderFuntcion()
 static Route buildPageRoute(RouteSettings settings) => PageRouteBuilder(
    pageBuilder: (BuildContext context, Animation animation,
        Animation secondaryAnimation) =>
      CustomRoutePage(),
   );

 ...

}

它會(huì)生成如下代碼:

Map _customRoutePage = {
 'custom_route_page': CustomRoutePage.buildPageRoute,
};

自定義路由(優(yōu)先級(jí):1)

這種方法自定義路由的優(yōu)先級(jí)最低,如果同時(shí)存在多種自定義路由選擇,則按優(yōu)先級(jí)從大到小選擇。

@RoutePage()
class CustomRoutePage extends StatelessWidget {
 // RoutePageBuilderFunction注解表明這個(gè)方法用來定義如何返回RoutePage
 // 它是可選的
 @RoutePageBuilderFunction()
 static Widget buildPage(BuildContext context, Animation animation,
     Animation secondaryAnimation, RouteSettings settings) =>
   CustomRoutePage();

 // RouteTransitionBuilderFunction注解表明這個(gè)方法用來定義如何應(yīng)用動(dòng)畫過渡
 // 它是可選的
 @RouteTransitionBuilderFunction()
 static Widget buildTransitions(
     BuildContext context,
     Animation animation,
     Animation secondaryAnimation,
     Widget child,
     RouteSettings settings) =>
   child;

 // RouteTransitionDurationField注解表明這個(gè)字段用來定義頁面過渡時(shí)常長,默認(rèn)值為300 milliseconds
 // 它是可選的
 @RouteTransitionDurationField()
 static Duration transitionDuration = Duration(milliseconds: 400);

 ...

}

它會(huì)生成如下代碼:

Map _customRoutePage = {
 'custom_route_page': (RouteSettings settings) => PageRouteBuilder(
    pageBuilder: (context, animation, secondaryAnimation) =>
      CustomRoutePage(),
    transitionsBuilder: (context, animation, secondaryAnimation, child) =>
      CustomRoutePage.buildTransitions(
        context, animation, secondaryAnimation, child, settings),
    transitionDuration: CustomRoutePage.transitionDuration,
   ),
};

注意事項(xiàng)

  • 只允許有一個(gè)initalRoute
  • initalRoute會(huì)忽略自定義路由名,但會(huì)生成名為ROUTE_HOME的路由名稱常量。
  • 所有自定義路由method或getter必須定義在路由所在類,且必須為static所修飾的和非私有的。

最終生成代碼

最終生成的文件名為FILENAME.route.dart

其中FILENAME是被Router注解的App類所在的文件名。

// GENERATED CODE - DO NOT MODIFY BY HAND

// **************************************************************************
// RouteGenerator
// **************************************************************************

import 'package:flutter/material.dart';
import 'home_page.dart';
import 'custom_route_page.dart';
import 'custom_route_name_page.dart';
import 'second_page.dart';
import 'one_arguement_page.dart';
import 'two_arguement_page.dart';

const ROUTE_HOME = '/';
const ROUTE_CUSTOM_ROUTE_PAGE = 'custom_route_page';
const ROUTE_CUSTOM = 'custom';
const ROUTE_SECOND_PAGE = 'second_page';
const ROUTE_ONE_ARGUMENT_PAGE = 'one_argument_page';
const ROUTE_TWO_ARGUMENT_PAGE = 'two_argument_page';

RouteFactory onGenerateRoute = (settings) => Map.fromEntries([
   ..._home.entries,
   ..._customRoutePage.entries,
   ..._custom.entries,
   ..._secondPage.entries,
   ..._oneArgumentPage.entries,
   ..._twoArgumentPage.entries,
  ])[settings.name](settings);

Map _home = {
 '/': (RouteSettings settings) => MaterialPageRoute(
    builder: (BuildContext context) => HomePage(),
   ),
};
Map _customRoutePage = {
 'custom_route_page': (RouteSettings settings) => PageRouteBuilder(
    pageBuilder: (context, animation, secondaryAnimation) =>
      CustomRoutePage.buildPage(
        context, animation, secondaryAnimation, settings),
    transitionsBuilder: (context, animation, secondaryAnimation, child) =>
      CustomRoutePage.buildTransitions(
        context, animation, secondaryAnimation, child, settings),
    transitionDuration: CustomRoutePage.transitionDuration,
   ),
};
Map _custom = {
 'custom': (RouteSettings settings) => MaterialPageRoute(
    builder: (BuildContext context) => CustomRoutePageName(),
   ),
};
Map _secondPage = {
 'second_page': (RouteSettings settings) => MaterialPageRoute(
    builder: (BuildContext context) => SecondPage(),
   ),
};
Map _oneArgumentPage = {
 'one_argument_page': (RouteSettings settings) => MaterialPageRoute(
    builder: (BuildContext context) =>
      OneArgumentPage(title: settings.arguments),
   ),
};
Map _twoArgumentPage = {
 'two_argument_page': (RouteSettings settings) => MaterialPageRoute(
    builder: (BuildContext context) => TwoArgumentPage(
       title: (settings.arguments as Map)['title'],
       subTitle:
         (settings.arguments as Map)['subTitle'],
      ),
   ),
};

常見問題

沒有生成路由文件

請檢查是否添加了Router注解

Example

獲取更詳細(xì)信息,請參閱example

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


文章題目:Flutter利用注解生成可自定義的路由的實(shí)現(xiàn)
網(wǎng)站地址:http://m.jcarcd.cn/article/pgjjid.html
主站蜘蛛池模板: 欧美在线观看视 | 国产又粗又大又爽 | 国产又粗又 | 日韩一区三区视频 | 99热在线播放 | www亚洲一区 | 日本大片免a | 国产污视频在线观看 | 成人免费国产ga | 国产拍在线| 日本最新成人精品 | 日韩午夜剧场人畜 | 国产高清视频欧美 | 成人一区在线观看 | 国语视频二区 | 成人亚洲性情网站w | aⅴ天堂中文字幕 | 日本在线www色 | 国产精品福利自产 | 91免费永久在 | 日韩制服丝| 国产日产欧产精品 | 精品自拍中 | 国产年轻娇小性hd | 日本一区二区在线看 | 国产对白在线观 | 国产色爽女免费视频 | 午夜一区二区免费看 | 日韩一区二区在线 | 日本一区二在线播放 | 国精品一区二区 | 欧美午夜日韩 | 国产精品色片免费 | 91精品视频免费 | 国产精品二区亚洲 | 国产亚洲精品美 | 国产日韩中文字幕 | 日本综合三级精品 | 美日韩国产 | 国产美女弄出 | 中文字幕丰 |