Ответ 1
RN android действительно не обновляет макеты детей или видимость или изменения адаптера в большинстве условий. Вставляя крючки в пользовательский вид, когда требуется обновление, которое приведет к недействительности /requestLayout, вызовите этот код, в основном, восстанавливается нормальное поведение. Есть еще некоторые случаи, когда измерение происходит не так, как обычно, и я должен опубликовать Runedable Runnables, которые затем вызывают это недействительность. Работа с родителями node может быть не обязательно необходима во всех случаях, но это для некоторых.
В Менеджере просмотра
Method markNewLayout, getShadowNode;
public ViewManager(){
super();
if (markNewLayout == null) {
try {
markNewLayout = CSSNode.class.getDeclaredMethod("markHasNewLayout");
markNewLayout.setAccessible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
try{
if (getShadowNode==null){
getShadowNode = UIImplementation.class.getDeclaredMethod("resolveShadowNode",int.class);
getShadowNode.setAccessible(true);
}
} catch (Exception e) {
e.printStackTrace();
}
public class MyShadowNode extends LayoutShadowNode {
@Override
public void markUpdated(){
super.markUpdated();
if (hasNewLayout()) markLayoutSeen();
dirty();
}
@Override
public boolean isDirty(){
return true;
}
@Override
protected CustomView createViewInstance(final ThemedReactContext reactContext) {
view.setRnUpdateListener(new CustomView.RNUpdateListener() {
MyShadowNode node;
@Override
public void needsUpdate() {
view.requestLayout();
Runnable r = new Runnable() {
@Override
public void run() {
if (node ==null){
try {
node = (MyShadowNode) getShadowNode.invoke(uiImplementation, view.getId());
}
catch (Exception e){
e.printStackTrace();
}
}
if (node != null) {
if (node.hasNewLayout()) node.markLayoutSeen();
ReactShadowNode parent = node.getParent();
while (parent != null) {
if (parent.hasNewLayout()) {
try {
markNewLayout.invoke(parent,view.getId());
} catch (Exception e) {
e.printStackTrace();
}
parent.markLayoutSeen();
}
parent = parent.getParent();
}
node.markUpdated();
}
Log.d(getName(), "markUpdated");
}
};
reactContext.runOnNativeModulesQueueThread(r);
}
});
}