最小單元 flutter for webURL導(dǎo)航與hashtag(#)的處理

關(guān)于Flutter for web的導(dǎo)航

通常對于傳統(tǒng)網(wǎng)站來說訪問行為是讓一個HTML地址對應(yīng)一個頁面資源维蒙,而對于APP來說內(nèi)部的多個頁面是通過代碼指令耦合的异希,整個APP實際上是一個資源。隨著應(yīng)用規(guī)模的擴大原本通過指令進行頁面跳轉(zhuǎn)的模式被抽取歸納統(tǒng)一為路由跳轉(zhuǎn)敛惊。隨著HYBRID的發(fā)展與urlscheme結(jié)合為協(xié)議路由統(tǒng)一跳轉(zhuǎn)與狀態(tài)傳遞的方式膊毁。

flutter中的頁面導(dǎo)航使用'router'進行胀莹,在應(yīng)用內(nèi)部導(dǎo)航的方式比較自由,指令或者命名或者根據(jù)已有規(guī)范統(tǒng)一到urlScheme中走中心路由的架構(gòu)都可以隨自己應(yīng)用的體量來選擇婚温。

攔截URL

使用 onGenerateRoute: onGenerateRoute可以截獲通過URL獲取路由的路徑描焰,在flutter for web中這里就可以截獲在瀏覽器地址中輸入的鏈接中index地址后面的部分

image
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key key}) : super(key: key);

@override
Widget build(BuildContext context) {

  return MaterialApp(
   title: "main",
      debugShowCheckedModeBanner: false,
      onGenerateRoute:  onGenerateRoute,

  );
}
}
Route<dynamic> onGenerateRoute(RouteSettings settings) {
  String routeName = settings.name;
//根據(jù)地址跳轉(zhuǎn)不同的頁面
  if (routeName.contains('/artical')) {
      //截取參數(shù)
    String arg = "";
    if(routeName.length > 10){
      arg =  routeName.substring(9,routeName.length);
    }
    return MaterialPageRoute(builder: (context) { return HomeWidget(arguments: arg,); });
  } else if (routeName.contains('/tool')) {
    return MaterialPageRoute(builder: (context) { return ToolsPage(); });
  }else if (routeName.contains('/quote')) {
    return MaterialPageRoute(builder: (context) { return KlinePage(); });
  }else{
    return  MaterialPageRoute(builder: (context) { return HomeWidget(); });
  }
}

HashTag("#")問題

由于Flutter for web 是作為HTMLApp的形式存在因此對于瀏覽器來說,無論進行多少次內(nèi)部跳轉(zhuǎn)仍然在一個頁面內(nèi)栅螟。

nginx以#為分界解析路徑荆秦。flutter通過hashtag判別獲取url路徑給onGenerateRoute進行攔截獲取參數(shù)。對于單頁面或者內(nèi)嵌WEBAPP來說這對訪問不會造成任何影響力图。但如果要通過URL訪問指定的頁面會在一些情況下無法訪問步绸。

隱藏自動添加的"/#/"

如果只需要通過根路徑訪問網(wǎng)站。此時flutter會自動將"/#/"拼接在地址欄中

image

如果希望去除# 有兩種方法

1.阻止自動添加#

可以從從項目中刪除向地址欄添加#的代碼 吃媒。

首先build項目瓤介,然后找到構(gòu)建的項目的 main.dart.js文件并打開搜索 '#'+a找到

we:function(a){return a.length===0?H.b(window.location.pathname)+H.b(window.location.search):"#"+a},

刪除 "#"+。

image
2.向瀏覽器添加一個新的URL
  html.window.history.pushState(null, "flutter", "/");

配合NGINX重定向使用URL導(dǎo)航

如果需要使用URL通過瀏覽器在flutter web app內(nèi)導(dǎo)航則需要使用hashTag的機制向APP傳遞地址信息赘那,此時若想要在導(dǎo)航鏈路中排除"#"惑朦,需要配合地址重定向和html.window.history.pushState來手動構(gòu)建導(dǎo)航體系。

  1. 通過NGINX添加重定向

    image
  2. 獲取路徑后Push訪問路經(jīng)

    image

如果是訪問有連接后綴的地址onGenerateRoute 會被調(diào)用兩次漓概,第一次是傳入空置進去漾月,第二次才會傳入地址欄中的地址。因此在沒有收到后綴的地址中不能pushstate否則會屏蔽掉后續(xù)的重定向內(nèi)容導(dǎo)致鏈接跳轉(zhuǎn)失效胃珍。

過程大致如圖

image

在這個方案下梁肿,頁面導(dǎo)航與Nginx地址解析實際上是深度綁定了NGINX需要重定向所有應(yīng)用中PUSHSTATE進瀏覽器的地址蜓陌。而如果使用了CDN加速 會導(dǎo)致重定向失效

通過瀏覽器獲取URL進行導(dǎo)航

在無法通過NGINX重定向來協(xié)助導(dǎo)航的情況下,只能根據(jù)瀏覽器這一使用場景做特殊處理吩蔑。讓實例自己獲取當前URL去做導(dǎo)航钮热。使用html.window.location獲取當前訪問的地址。而NGINX只需要將所有有導(dǎo)航目的地的路徑都指向根目錄就行了烛芬。

NGINX:

image

Flutter:

image

最后 如果設(shè)置了一些特殊的NGINX規(guī)則如二級路徑有可能導(dǎo)致flutter中無法找到圖片資源隧期。因此建議使用遠端資源。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赘娄,一起剝皮案震驚了整個濱河市仆潮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遣臼,老刑警劉巖性置,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揍堰,居然都是意外死亡鹏浅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門屏歹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隐砸,“玉大人,你說我怎么就攤上這事蝙眶』巳” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵械馆,是天一觀的道長。 經(jīng)常有香客問我武通,道長霹崎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任冶忱,我火速辦了婚禮尾菇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘囚枪。我一直安慰自己派诬,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布链沼。 她就那樣靜靜地躺著默赂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪括勺。 梳的紋絲不亂的頭發(fā)上缆八,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天曲掰,我揣著相機與錄音,去河邊找鬼奈辰。 笑死栏妖,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的奖恰。 我是一名探鬼主播吊趾,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瑟啃!你這毒婦竟也來了论泛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤翰守,失蹤者是張志新(化名)和其女友劉穎孵奶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜡峰,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡了袁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了湿颅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片载绿。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖油航,靈堂內(nèi)的尸體忽然破棺而出崭庸,到底是詐尸還是另有隱情,我是刑警寧澤谊囚,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布怕享,位于F島的核電站,受9級特大地震影響镰踏,放射性物質(zhì)發(fā)生泄漏函筋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一奠伪、第九天 我趴在偏房一處隱蔽的房頂上張望跌帐。 院中可真熱鬧,春花似錦绊率、人聲如沸谨敛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脸狸。三九已至,卻和暖如春藐俺,著一層夾襖步出監(jiān)牢的瞬間肥惭,已是汗流浹背盯仪。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜜葱,地道東北人全景。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像牵囤,于是被迫代替她去往敵國和親爸黄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360