一個Flex 對話方塊的坑

一寧發表於2014-06-07
最近在專案中遇到一個問題,在Flex中使用Alert.show("this is content!", "title");發現對話方塊可以彈出來,但是文字始終不顯示。why? 由此開始了我苦逼的排查之路。 
 
首先,可以排除沒有引入包 import mx.controls.Alert;的問題。如果沒有引入包的話,編譯會出現錯誤。所以這一點可以排除掉。
但是這個工程之前就可以彈出對話方塊啊,為什麼現在不能正常彈出呢?系統原生的對話方塊竟然不起作用!是不是因為文字的css設定有問題呢?比如字型或者顏色的設定造成了文字的不可見?有可能啊。然後自己設定了下css,背景設定為白色,字型設定為紅色。重新編譯,坐等奇蹟的發生。但是對話方塊除了個框框還是什麼都沒有!看來css的設定沒有起作用。
 
那會不會被別的css給覆蓋了呢?本著這個想法,去工程裡面去找,果然,不出我所料,一個css的頁面自定義了Alert的樣式,然後果斷註釋了這段程式碼,重新編譯,等待驚喜,失望了,驚喜沒有發生。還是以前那個樣子。
 
雖然到目前為止,對話方塊還是不能正常使用,但是可以肯定一點的是,跟css沒有關係。那就只剩下兩種可能了:
(1)對話方塊本身有問題;(2)對話方塊沒有問題,但是系統可能不支援。
 
對話方塊本身會有問題麼?想到這裡,突然想起系統本身其他地方也有使用對話方塊的啊。
然後仔細看了下以前彈出對話方塊的程式碼。有收穫,發現之前對話方塊不是原生的Alert,而是一個被封裝的AlertInfo,該AlertInfo繼承 了Panel,完成了對對話方塊的模擬!ok,看到這裡,應該比較清楚了,怎麼去做一個對話方塊。用自定義的AlertInfo,去模擬一個對話方塊。果斷
new AlertInfo;重新編譯,這回應該是問題不大了。可是沒有我想象的那麼簡單,依然有問題。而且,該系統不僅使用了自定義的AlertInfo,而且使用了原生的Alert。
 
這下該令人頭疼了。原生對話方塊不能使用,自定義對話方塊不能使用,就連以前正常可以執行的對話方塊也無法正常使用了!
 
有點煩躁。冷靜了一下後,開始重新思考面前的問題。目前我正在使用的升級工程,那麼我重新建立一個新的檔案test.mxml檔案,裡面只寫了一句話:Alert.show("content","title");震精了,竟然也不正常!好吧!使用Flex Builder 重新建立一個Flex專案,新建一個test.mxml檔案,發現新專案的可以正常彈出對話方塊。為何?我仔細比對了兩個檔案。發現兩個mxml的根標籤Application就不一樣。
升級工程中test.mxml的程式碼:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml "
                layout=" absolute" minWidth=" 955" minHeight="600"
                creationComplete="init()">
</mx:Application>
新工程中的test.mxml程式碼:
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009 "
               xmlns:s="library://ns.adobe.com/flex/spark "
               xmlns:mx="library://ns.adobe.com/flex/mx "
               minWidth="955" minHeight="600">
</s:Application>
 很顯然,兩者所引用的庫是不一樣的。升級工程中是flex3引用的庫,而新工程中則是flex4引用的工程,而且兩者的標籤是不同的,flex3是以<mx:Application></mx:Application>開始,而flex4是以<s:Application></s:Application>開始。為什麼會出現這種情況呢?即使是出現這種情況,flex3應該也支援Alert的,那在升級工程中的Alert為啥不正常呢?而且關鍵是兩者使用的都是flex4.1 的sdk。可能跟編譯環境有關。看了下兩者的編譯選項,果然就發現問題了。原來升級工程中使用的相容flex3的模式。而新專案則沒有使用。那在相容模式下就不能正常使用Alert了?上網谷歌了一下,發現有很多網友也有的問題。原來Flex4和Flex3 的差別還是蠻大的。包括Alert在內的很多控制元件在相容模式下都無法正常使用。好吧,既然是相容因起來的問題,那果斷去掉相容。重新編譯,對話方塊出來了,文字也出來了。所以問題的最終原因不是對話方塊的問題,是系統環境的原因。可是主工程使用的明明是Flex4,升級工程憑什麼搞一個Flex3出來?看了下升級工程的日期,建立日期是2013年7月。為何不和主工程(升級工程算是主工程的一個外掛)使用同樣的環境?可能前同事出於其他原因的考慮吧,或者說就是無意埋下的坑。好吧,為了為了和主工程保持一致,我將Flex3升級為Flex4,樣式由預設的helo該為spark,重新跑一遍程式。看起來是無大礙了。
 
到此為止,花了整整一天時間,一個Alert只彈框,不顯示文字的問題就全部結束了。縱觀整個過程,發現問題,分析問題,假設,求證,發現問題的癥結,解決問題,最後升級系統。
 
 如果發現問題後,一開始就使用谷歌,可能會減少很多時間去解決這個問題。谷歌雖然強大,但我還是願意先去自己做一些摸索,做一些分析,萬不得以,再去考慮搜尋引擎。誰說假設求證不也是一件很愉快的事情呢?雖然這個過程耗費時間會比較長。
 

相關文章