Crash: YogaLayoutableShadowNode.cpp: function layout: assertion failed (YGNodeGetOwner(childYogaNode) == &yogaNode_)
オープン
まだ誰も着手していません。
Needs: Attention
Needs: Repro
- 主要言語
- C++
- スター
- 127k
- フォーク
- 25.3k
- 平均マージ
- 1日 23時間
- マージ済み PR(30日)
- 4
説明
Description
- There is some sort of crash when ui is rendered
Steps to reproduce
- Use conditional rendering for view to display ui based on condition (not sure though what is causing this)
Note: it is working fine on 0.77 though once upgraded then facing this issue
import React from 'react';
import { View, StyleSheet } from 'react-native';
import { t } from '../i18n';
import { ProgressBar } from '@ui-kitten/components';
import { TPhoto } from '../types';
import { Colors } from '../theme';
import AppLightButton from './AppLightButton';
import Upload from '../theme/icons/Upload.svg';
import AppText from './AppText';
type Props = {
image: TPhoto;
retryUpload: boolean;
onRetryUpload: (image: TPhoto) => void;
currentImageIndex: number;
totalImages: number;
};
const ImageUploadProgress = ({ image, retryUpload, totalImages, currentImageIndex, onRetryUpload }: Props) => {
return (
<View style={styles.photoUpload}>
<View style={styles.uploadTitle}>
<AppText style={styles.uploadTitleText}>
{t('common._uploading-images', {
count: currentImageIndex,
total: totalImages,
})}
</AppText>
{image.uploadStatus === 'completed' ? (
<AppText style={styles.uploadTitleTextComplete}> - {t('common.complete')} </AppText>
) : (
<View />
)}
{image.uploadStatus === 'failed' || image.uploadStatus === 'uploading' ? (
<View>
<AppText style={styles.uploadTitleTextFailed}>
{image.uploadStatus === 'failed' ? `- ${t('common.failed')}` : ''}
</AppText>
{retryUpload && (
<AppLightButton
text={t('common.retry')}
buttonIcon={<Upload width={10} fill={Colors.warn} />}
onPress={() => onRetryUpload(image)}
style={styles.stepButton}
textStyle={styles.stepButtonText}
/>
)}
</View>
) : (
<View />
)}
</View>
<ProgressBar
progress={image.uploadStatus === 'completed' ? 1 : image.progress}
size="medium"
style={styles.progressBarStyle}
status={
image.uploadStatus === 'failed' ? 'danger' : image.uploadStatus === 'completed' ? 'success' : 'info'
}
/>
</View>
);
};
export default ImageUploadProgress;
const styles = StyleSheet.create({
photoUpload: { marginVertical: 20 },
uploadTitle: { flexDirection: 'row', justifyContent: 'space-between' },
uploadTitleText: {
fontSize: 14,
fontFamily: 'ProximaNova-Regular',
textAlign: 'center',
textAlignVertical: 'center',
},
uploadTitleTextFailed: {
fontSize: 14,
fontFamily: 'ProximaNova-Bold',
textAlign: 'center',
textAlignVertical: 'center',
color: Colors.error,
},
uploadTitleTextComplete: {
fontSize: 14,
fontFamily: 'ProximaNova-Bold',
textAlign: 'center',
textAlignVertical: 'center',
color: Colors.success,
},
progressBarStyle: {
marginTop: 5,
},
stepButton: {
height: 25,
width: 70,
backgroundColor: Colors.orangeTransparent,
borderColor: Colors.warn,
},
stepButtonText: { fontSize: 10, fontFamily: 'ProximaNova-Bold', height: 10, color: Colors.warn },
});
React Native Version
0.79.4
Affected Platforms
Runtime - Android
Output of npx @react-native-community/cli info
- There is no output. The app closes without any error
Stacktrace or Logs
/__w/react-native/react-native/packages/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp:701: function layout: assertion failed (YGNodeGetOwner(childYogaNode) == &yogaNode_)
MANDATORY Reproducer
https://github.com/facebook/react-native
Screenshots and Videos
- The app crashes abruptly no warning nothing. Log found in android studio
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp の 701 行目から始め、React Native 0.79.4 を使用して Android でクラッシュを再現します。提示された ImageUploadProgress の例を中心に条件付きレンダリングの状態を比較し、その後、Yoga owner assertion に違反する layout state を絞り込みます。トリガーとなるケースを理解し、突然の assertion crash が解消されるか、最小限の reproducer に明確に縮小されれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- android, cpp, react-native
- 領域
- mobile
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 活発
- 明瞭さ
- 説明が足りない
- 初心者へのやさしさ
- 35/100