哈嘍,我是老劉
你敢信嗎?
開發者在升級Dart 3.9.0後,集體"翻車"了!
Google IO大會宣傳的dart mcp server功能居然不能用。
使用AI助手調用dart mcp server功能,會返回如下錯誤:
It seems you need to update your Dart SDK. The required version is 3.9.0-163.0.dev or greater.
什麼鬼?
我去github上看了下,3.9.0應該是這個系列最終的正式版,理論上版本號比3.9.0-163.0.dev要高。
正好,在github上看到還有最新的3.10.0版本,那就升級到3.10.0試試。
還是不行!
這波操作真的是把程序員們整不會了。
好傢伙,這好像沒經過測試就發佈了。
如果你也踩過這個坑,那你絕對不是一個人在戰鬥。
今天老劉就來給大家扒一扒,這個讓無數開發者抓狂的bug到底是怎麼回事,以及如何優雅地解決它。
問題原因分析
説實話,剛開始遇到這個問題的時候,我也是一臉懵逼。
明明版本號都對了,為什麼還是報錯?
深入研究了GitHub上的issue後,我終於找到了問題的根源。
核心問題:URI類型搞混了!
原來,當我們給LLM傳遞的URI實際上是一個VM(虛擬機)服務URI,而不是DTD(Dart Tooling Daemon)URI時,就會出現這個詭異的錯誤。
什麼意思呢?
簡單來説,Dart的開發工具鏈中有兩套不同的服務體系:
VM Service URI: 這是Dart虛擬機提供的調試接口,主要用於性能分析、內存監控等底層操作。
DTD URI: 這是Dart Tooling Daemon提供的工具鏈接口,專門為IDE和外部工具設計的高級API。
AI助手調用dart mcp需要的是DTD URI,但是LLM在默認情況下拿不到DTD Uri,只能獲取到VM Service URI。
這就像你拿着銀行卡去刷地鐵,卡是真的,錢也夠,但就是刷不了。
理論上來説這是Dart工具鏈的一個bug,沒有把整個環節打通。
老劉個人猜測是為了趕發佈時間沒有充分測試。
更深層的問題在於錯誤提示的邏輯缺陷
在不同的異常處理流程下沒有從底層反饋並捕獲正確的異常信息,給使用者有效的提示。
所以老劉自己浪費了不少時間去測試3.10版本,但是其實這個問題和版本沒有任何關係。
別慌!一招讓Dart MCP重新為你打工
既然知道了問題的根源,解決方案其實很簡單。
核心思路就是:獲取DTD URI,然後傳遞給LLM
具體操作步驟如下:
第一步:啓動Flutter項目並獲取DTD URI
給Flutter默認的執行命令添加一個參數:
flutter run --print-dtd
注意這裏的關鍵參數是--print-dtd,不是普通的flutter run。
運行後,終端會輸出類似這樣的信息:
A Dart VM Service on sdk gphone64 x86 64 is available at: http://127.0.0.1:13876/2I5k4Otig48=/
The Dart Tooling Daemon is available at: ws://127.0.0.1:13879/IkY5qdOwSQ0=
The Flutter DevTools debugger and profiler on sdk gphone64 x86 64 is available at:
http://127.0.0.1:9101?uri=http://127.0.0.1:13876/2I5k4Otig48=/
這個“ws://...”就是真正的DTD Uri了。
第二步:讓LLM讀取正確的Uri
這裏要注意,我們需要的是DTD URI,也就是ws://127.0.0.1:9394/ws這個地址。
不要搞混了Dev Tools URL,那個是給瀏覽器用的。
另外這裏也不需要手工的給LLM複製粘貼,只要在提示詞中告訴LLM從正確的位置獲取DTD URI,然後我們試一下。
看到已經成功連接到MCP了。
甚至老劉測試過,即使不加任何提示詞,只要Flutter項目編譯過程中打印出DTD URI,LLM大概率就會自動讀取到正確的URI。
第三步:讓Dart MCP工作
可以直接要求LLM獲取當前的組件樹,效果如下:
當然你也可以做更多的事情,比如讓LLM基於這個mcp進行代碼調試等等。
總結
説實話我覺得這個bug是Dart工具鏈的一個設計缺陷,沒有從底層反饋並捕獲正確的異常信息,給使用者有效的提示。
或者説是發佈的太倉促,沒有經過充分的測試,導致這個問題暴露出來。
好了,本文算是幫大家掃清一個障礙,下一篇文章會系統的介紹Dart MCP Server的使用方法。
如果看到這裏的同學對客户端開發或者Flutter開發感興趣,歡迎聯繫老劉,我們互相學習。
點擊免費領老劉整理的《Flutter開發手冊》,覆蓋90%應用開發場景。
可以作為Flutter學習的知識地圖。
覆蓋90%開發場景的《Flutter開發手冊》