Nylo v6 新功能說明:Flutter 微框架更新項目與開發差異整理

Published on: | Last updated:

最近 Flutter 社群有個東西叫 Nylo 更新到 v6,看到一些討論。我自己也稍微看了一下,嗯...它把自己叫做「微框架」(micro-framework),這個定位還蠻有趣的。不是像 GetX 那種大包大攬的,也不是讓你從零開始自己拼,就卡在中間。

所以,這個 v6 版到底多了些什麼?值不值得花時間去了解?我把它的一些更新整理了一下,順便加點我自己的想法。老實說,有些功能看起來是真的能省不少事。

先說結論,Nylo v6 到底想幹嘛?

我自己是覺得,它就是想把一些你每次開新專案都要做一遍的髒活累活,比如說設定路由、弄個底部導航欄、做一堆表單...全都幫你打包好。讓你用幾個指令、改幾個設定檔就能搞定。目標很明確:加速開發初期,讓你的專案結構更統一

但...這種「統一」通常也是雙面刃,後面會聊到。

開發流程簡化示意圖
開發流程簡化示意圖

幾個我覺得「有感」的更新

它更新的點還不少,但我挑幾個我覺得特別值得拿出來講的。特別是 `Navigation Hub` 和 `Forms`,這兩個真的是... 如果你常常做 CRUD 或工具類型的 App,可能會眼睛一亮。

路由管理(Routing),變得更...集中了

以前用 Flutter,路由管理方案很多,go_router、auto_route,或者就用原生的 Navigator。Nylo 把它整合起來,讓你用一個檔案就管好所有頁面。

你看,它的寫法長這樣:


// File: /routes/router.dart

appRouter() => nyRoutes((router) {
      // 一進來的首頁
      router.add(LandingPage.path).initialRoute();

      // 需要登入才能看的頁面
      router.add(DashboardPage.path).authenticatedRoute();
      
      // 其他一般頁面
      router.add(BlogPostsPage.path);
      router.add(PostDetailPage.path);
      
      // 404 頁面
      router.add(NotFoundPage.path, unknownRoute: true);
});
    

這種鏈式語法還算清楚。`.initialRoute()` 就是設定 App 一打開的預設頁面。比較有趣的是 `.authenticatedRoute()`,這東西是說「如果使用者登入過,那下次打開 App 就直接進這個頁面」。

要實現這個,你只要在登入成功的地方呼叫 `Auth.authenticate()` 就行。Nylo 會自己處理狀態,下次使用者再開 App,就會看到儀表板而不是登入頁。算是個貼心的小功能,不用自己寫 SharedPreferences 或 secure storage 來記這些狀態了。

不過,它這個路由傳遞資料的方式...嗯,`data()` 直接拿,感覺有點太「魔法」了。雖然方便,但有時候可讀性會差一點,你不知道這個 `data()` 到底是從哪裡來的,也不知道它的型別是什麼。這點跟 go_router 那種在路徑上定義參數的作法很不一樣,有好有壞。

Navigation Hub:做底部導航欄的產生器?

這個功能號稱是 `game-changer`...嗯,我是覺得有點誇張啦,但它確實解決了一個痛點。在 Flutter 裡面要弄一個帶有狀態保存的底部導航(BottomNavigationBar)其實有點煩,每個 Tab 頁的狀態要怎麼保持,切換時要不要重載,都要自己處理。

Nylo 的作法是,你用一個指令:


dart run nylo_framework:main make:navigation_hub base
    

它就會幫你生出一個 `BaseNavigationHub` 的檔案。裡面長得像這樣:

Navigation Hub 的程式碼片段
Navigation Hub 的程式碼片段

class _BaseNavigationHubState extends NavigationHub<basenavigationhub> {

  // 在這裡決定你要底部導航、頂部 Tab、還是步驟流程
  NavigationHubLayout? layout = NavigationHubLayout.bottomNav(
    // 還可以客製化一些顏色、大小什麼的
    // backgroundColor: Colors.white,
  );

  // 在這裡定義你的 Tab 頁面
  _BaseNavigationHubState() : super(() async {
    return {
      0: NavigationTab(
        title: "Home",
        page: HomeTab(), // 你自己做的 Widget
        icon: Icon(Icons.home),
      ),
      1: NavigationTab(
         title: "Settings",
         page: SettingsTab(), // 另一個 Widget
         icon: Icon(Icons.settings),
      ),
      // 也可以加小紅點
      2: NavigationTab.badge(
         title: "Messages",
         page: MessagesTab(),
         icon: Icon(Icons.message),
      ),
    };
  });
}
    </basenavigationhub>

你看,你只要定義好 `layout` 是 `bottomNav`,然後在 `super` 的 map 裡面把你的頁面跟 icon 塞進去,一個功能完整的底部導航就...完成了。它預設會幫你處理好頁面狀態保存 (`maintainState` 預設是 true)。

說真的,這對快速開發原型或一些功能單純的 App 來說,真的蠻快的。不用再去煩惱 `IndexedStack` 或是 `PageController` 那些東西。

Forms:用 Class 來定義整個表單

做表單也是一件苦差事。欄位、驗證、樣式、拿資料、送出...一堆重複的程式碼。Nylo v6 的 `Forms` 功能試圖解決這個問題。

一樣,先用指令產生一個 Form class:


dart run nylo_framework:main make:form report_an_issue
    

然後你會得到一個 `ReportAnIssueForm` class,在裡面定義你的欄位跟驗證規則:


class ReportAnIssueForm extends NyFormData {

  // ...

  @override
  fields() => [
    // 一行可以放多個欄位
    [
      Field.capitalizeWords("First Name",
          validate: FormValidator.notEmpty().minLength(3)
      ),
      Field.capitalizeWords("Last Name",
          validate: FormValidator.notEmpty().minLength(3)
      ),
    ],
    // 或是一行一個
    Field.email("Email",
        validate: FormValidator.email()
    ),
    Field.textArea("Report",
        validate: FormValidator.maxLength(250)
    ),
  ];
  
  // 連送出按鈕都可以在這裡定義
  @override
  Widget? get submitButton => Button.primary(text: "Submit", submitForm: (this, (data) {
    // 按下按鈕後,通過驗證的資料會在這裡
    print(data);
  }));
}
    

在你的頁面裡,只要一行 `NyForm(form: form)`,整個表單,包含所有欄位、驗證邏輯、送出按鈕,就全部畫出來了。這...真的蠻酷的。把 UI、State、Validation 全部都封裝在一個 class 裡面。

用 Nylo Forms 快速產生的回報問題頁面
用 Nylo Forms 快速產生的回報問題頁面

它內建的 Field 種類也很多,什麼日期選擇、密碼、數字、選項...基本上常用的都有。這讓我想起以前用 Ruby on Rails 或 Django 那種感覺,框架幫你把表單處理得好好的。

所以,跟其他方案比起來呢?

講了這麼多,那它跟我們常用的 GetX 或 Bloc + 純手刻比起來,到底差在哪?我弄了個簡單的比較表,加了一些我自己的主觀感受。

比較項目 Nylo v6 純 Flutter + Bloc GetX
上手速度 蠻快的。指令一敲,範本就出來了。適合想馬上看到成果的人。 最慢。你要自己搞懂 Bloc 的概念,還要自己組織檔案結構。 也很快。GetX 的語法很精簡,但它的「魔法」更多,有時候會搞不懂背後發生什麼事。
程式碼量 (做同件事) 最少。特別是做導航欄和表單的時候,很多 code 都被藏在框架裡了。 最多。所有東西都是自己寫,優點是透明,缺點就是...囉嗦。 也算少。Get.to()、Obx() 這些都很短,但整個專案看下來可能還是比 Nylo 多一點點。
自由度/彈性 最低。它的「慣例優於設定」很明顯,你要照它的規矩玩。想改底層的東西可能會很卡。 最高。你想怎麼改就怎麼改,完全的自由,但也代表你要負全責。 中等。GetX 雖然也很有主見,但它的模組拆分得比較散,你可以只用它的狀態管理,不用它的路由。
我自己的感覺 像一個訓練有素的助手,幫你處理雜事。但有時候會覺得他有點固執,不讓你碰他的東西。 像一堆樂高積木。給你無限可能,但你得自己從頭設計藍圖,還要一塊一塊拼起來。 像一個...嗯...太熱心的魔法師。常常在你沒注意到的地方幫你變出東西,有時候是驚喜,有時候是驚嚇。

不過,這種「幫你想好」的框架,代價是什麼?

這就是我想談的重點。Nylo 這種「有主見的」(opinionated)框架,最大的好處是快、有規範。對新手或小型團隊來說,可以避免大家寫出五花八門的程式碼,維護起來比較輕鬆。這點我完全同意。

但代價就是「綁定」。你選擇了 Nylo,基本上你的專案架構、狀態管理、路由方式...很大一部分就被它決定了。如果未來某個功能 Nylo 的方案不適用,你要嘛得花很大力氣去繞過它,要嘛就得忍受。這就是所謂的框架綁定(Framework Lock-in)。

還有啊,社群生態也是個問題。像是 Flutter 社群,尤其在台灣或亞洲,很多人習慣用 `Bloc` 或 `GetX`。這代表你能找到的中文教學、工作機會、可以問問題的人,大多都是圍繞在這兩個生態系。Nylo 相對就小眾很多。這不是說它不好,但這是很現實的考量。

你在網路上找資料,像是美國的 `Flutter Community` 或 `Medium` 上可能比較多 Nylo 的討論,但回到台灣的開發者社群,能跟你深入聊這個的可能就不多了。當你卡關的時候,這點會變得很重要。

所以,該用嗎?

說了這麼多,好像把它批評了一下。但我其實不討厭 Nylo。我自己是覺得,它很適合特定情境:

  1. 快速原型開發:需要在一兩週內弄出一個可以點、可以操作的 App Demo 給客戶看。
  2. 個人專案或小型工具 App:功能不複雜,開發者就你一個人,不想花時間在建立專案架構上。
  3. 從後端轉過來的開發者:如果你習慣了 Rails、Django、Laravel 那種全功能的後端框架,Nylo 的思維模式你可能會覺得很親切。
  4. ol>

    但如果你的專案預期會很龐大、很複雜,有很多客製化的需求,或者團隊成員對 Flutter 的掌握度已經很高了,那可能還是選擇 `Bloc` 或 `Riverpod` 這種更基礎、更彈性的狀態管理方案,自己搭建架構,長期來看會比較穩健。

    總之,Nylo v6 的更新方向是明確的,就是要做一個「開發加速器」。它不是要取代誰,而是提供一個新的選擇。了解它的優缺點,再看看自己的專案需求,才知道它到底適不適合你。沒有最好的工具,只有最適合的工具,老話一句,但還是很有道理。


    那你呢?你現在是用什麼方式在管理你的 Flutter 專案?是 GetX 的愛好者,還是 Bloc 的死忠粉絲?或是有在觀望其他框架?在下面留言分享一下你的看法吧!

Related to this topic:

Comments

  1. Guest 2025-08-22 Reply
    嘿!好想用Nylo開發APP耶,學長推薦這框架超酷。剛好最近專題需要做mobile,能不能分享更多實戰經驗?對於表單和路由這塊超有興趣!
撥打專線 LINE免費通話