- Unable to find a specification for 'boost-for-react-native' depended upon by
Folly
#18085
解決的方案: pod update
- React Native報錯:Application XXX has not been registered.
RN 與原生之間的通信
從原生組件傳遞屬性到React Native
我們使用RCTRootView將React Natvie視圖封裝到原生組件中。RCTRootView是一個UIView容器,承載著React Native應(yīng)用命贴。同時它也提供了一個聯(lián)通原生端和被托管端的接口。
通過RCTRootView的初始化函數(shù)你可以將任意屬性傳遞給React Native應(yīng)用满粗。參數(shù)initialProperties必須是NSDictionary的一個實例。這一字典參數(shù)會在內(nèi)部被轉(zhuǎn)化為一個可供JS組件調(diào)用的JSON對象漠嵌。
NSArray *imageList = @[@"http://foo.com/bar1.png",
@"http://foo.com/bar2.png"];
NSDictionary *props = @{@"images" : imageList};
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
moduleName:@"ImageBrowserApp"
initialProperties:props];
RCTRootView同樣提供了一個可讀寫的屬性appProperties嚼黔。在appProperties設(shè)置之后,React Native應(yīng)用將會根據(jù)新的屬性重新渲染瓣颅。當然倦逐,只有在新屬性和之前的屬性有區(qū)別時更新才會被觸發(fā)。
從React Native傳遞屬性到原生組件
屬性的限制
跨語言屬性的主要缺點是不支持回調(diào)方法弄捕,因而無法實現(xiàn)自下而上的數(shù)據(jù)綁定僻孝。設(shè)想你有一個小的RN視圖,當一個JS動作觸發(fā)時你想從原生的父視圖中移除它守谓。此時你會發(fā)現(xiàn)根本做不到,因為信息需要自下而上進行傳遞您单。
雖然我們有跨語言回調(diào)(參閱這里)斋荞,但是這些回調(diào)函數(shù)并不總能滿足需求。最主要的問題是它們并不是被設(shè)計來當作屬性進行傳遞虐秦。這一機制的本意是允許我們從JS觸發(fā)一個原生動作平酿,然后用JS處理那個動作的處理結(jié)果。
其他的跨語言交互(事件和原生模塊)
如上一章所說悦陋,使用屬性總會有一些限制蜈彼。有時候?qū)傩圆⒉蛔阋詽M足應(yīng)用邏輯,因此我們需要更靈活的解決辦法俺驶。這一章描述了其他的在React Native中可用的通信方法幸逆。他們可以用來內(nèi)部通信(在JS和RN的原生層之間),也可以用作外部通信(在RN和純原生部分之間)。
React Native允許使用跨語言的函數(shù)調(diào)用还绘。你可以在JS中調(diào)用原生代碼楚昭,也可以在原生代碼中調(diào)用JS。在不同端需要用不同的方法來實現(xiàn)相同的目的拍顷。在原生代碼中我們使用事件機制來調(diào)度JS中的處理函數(shù)抚太,而在React Native中我們直接使用原生模塊導出的方法。
從原生代碼調(diào)用React Natvie函數(shù)(事件)
事件的詳細用法在這篇文章中進行了討論昔案。注意使用事件無法確保執(zhí)行的時間尿贫,因為事件的處理函數(shù)是在單獨的線程中執(zhí)行。
事件很強大踏揣,它可以不需要引用直接修改React Native組件帅霜。但是,當你使用時要注意下面這些陷阱:
由于事件可以從各種地方產(chǎn)生呼伸,它們可能導致混亂的依賴身冀。
事件共享相同的命名空間,因此你可能遇到名字沖突括享。沖突不會在編寫代碼時被探測到搂根,因此很難排錯。
如果你使用了同一個React Native組件的多個引用铃辖,然后想在事件中區(qū)分它們剩愧,name你很可能需要在事件中同時傳遞一些標識(你可以使用原生視圖中的reactTag作為標識)。
在React Native中嵌入原生組件時娇斩,通常的做法是用原生組件的RCTViewManager作為視圖的代理仁卷,通過bridge向JS發(fā)送事件。這樣可以集中在一處調(diào)用相關(guān)的事件犬第。
從React Native中調(diào)用原生方法(原生模塊)
原生模塊是JS中也可以使用的Objective-C類锦积。一般來說這樣的每一個模塊的實例都是在每一次通過JS bridge通信時創(chuàng)建的。他們可以導出任意的函數(shù)和常量給React Native歉嗓。相關(guān)細節(jié)可以參閱這篇文章丰介。
事實上原生模塊的單實例模式限制了嵌入。假設(shè)我們有一個React Native組件被嵌入了一個原生視圖鉴分,并且我們希望更新原生的父視圖哮幢。使用原生模塊機制,我們可以導出一個函數(shù)志珍,不僅要接收預(yù)設(shè)參數(shù)橙垢,還要接收父視圖的標識。這個標識將會用來獲得父視圖的引用以更新父視圖伦糯。那樣的話柜某,我們需要維持模塊中標識到原生模塊的映射嗽元。 雖然這個解決辦法很復(fù)雜,它仍被用在了管理所有React Native視圖的RCTUIManager類中莺琳,