Сгибать динамически при изменении ориентации (перевернуть устройство) - PullRequest
1 голос
/ 22 марта 2020

Я еще не готов заблокировать свое приложение в портретном режиме, пока я не уверен, что мы не сможем это выяснить.

Когда-то был контейнер с именем SwipeListView. Это сторонний пакет, если вы не знаете, можете проверить этот перекус: react-native-swipe-list-view. Это работает, но задний слой каждой строки не растягивается на всю ширину экрана, когда я переворачиваю свое устройство (портрет -> пейзаж)

image image

Сам элемент списка растягивается нормально, но задний слой (с кнопками) придерживается своей первоначальной ширины.
Вот SwipeListView с renderItem для данных элемента и renderHiddenItem для заднего слоя для каждого. строка:

<SafeAreaView style={{flex:1}}>
    <SwipeListView
        keyExtractor={Child.keyExtractor}
        data={this.props.children}
        renderItem={(itemInfo, rowMap) => {
            return <ChildListItem child={itemInfo.item}
                onPress={() => console.log("Row pressed: ", itemInfo)} />
        }}
        renderHiddenItem={(itemInfo, rowMap) => {
            return <ChildListHiddenItem child={itemInfo.item}
                onEdit={() => this.props.openEditChildDialog(true, itemInfo.item.id)}
                onDelete={() => this.props.openDeleteChildDialog(true)} />
        }}
        onRowDidOpen={rowKey => console.log(`Row with key ${rowKey} openend`)}
        leftOpenValue={75}
        rightOpenValue={-75}
        previewRowKey={'0'}
        previewOpenValue={-40}
        previewOpenDelay={3000}
    />
</SafeAreaView>

Ради длины я избавлю вас от ChildListItem. Это ChildListHiddenItem:

class CChildListHiddenItem
extends Component<IChildListHiddenItemProps>
implements ComponentLifecycle<IChildListHiddenItemProps, {}> {
    shouldComponentUpdate(nextProps: Readonly<IStyleState>, nextState: Readonly<IStyleState>, nextContext: any): boolean {
        return this.props.orientation !== nextProps.orientation;
    }

    render() {
        const {
            child,
            style,
            onDelete,
            onEdit,
            ...viewProps
        } = this.props;
        return(

            <LinearGradient
                style={[
                    styles.containers.listHiddenItem,
                    {flexBasis: this.props.dimensions.width}, \\ <----- OVER HERE
                    // orientationAwareStyles.apply.flexBasisFull,
                    style
                ]}
                colors={['red','transparent', 'green']}
                start={{x: 0, y: .5}} end={{x: 1, y: .5}}
                locations={[0.1,0.5,0.9]}
                {...viewProps}
            >
                <Buttons.ListDelete onPress={onDelete} />{/* iconName="user-minus" */}
                <Buttons.ListEdit onPress={onEdit} />{/* iconName="user-edit" */}
            </LinearGradient>
        )
    }
}
const mapStateToChildListHiddenItemProps = ((state:IStore) => {
    return {
        orientation: state.style.orientation,
        dimensions: state.style.dimensions,
    };
});

// @ts-ignore
export const ChildListHiddenItem = connect<IStore>(mapStateToChildListHiddenItemProps, null)(CChildListHiddenItem);

и применяемое свойство StyleSheet:

listHiddenItem: {
    flex:1,
    flexDirection: 'row',
    flexBasis: dimWindow.width,
    flexWrap: "nowrap",
    justifyContent: 'space-between',
    height: 50,
},

Я избавлю вас от логики c для обновления this.props.dimensions тоже, потому что я подтвердил, что это значение корректно обновляется, поместив точку останова в функцию рендеринга.

Любые идеи или прошлый опыт?

PS: Если вам это нужно:

Двоичные файлы:
Узел: 13.9.0 - C: \ Program Files \ nodejs \ node.EXE
npm: 6.13.7 - C: \ Program Files \ nodejs \ npm .CMD
IDE:
Android Studio: версия 3.6.0.0 AI-192.7142.36.36.6241897
npmПакеты:
реакция: 16,9,0 => 16,9,0
Reaction-native: ^ 0.61.5 => 0.61.5

Попытка обновления

<View
    style={[
        styles.containers.listHiddenItem,
        {flexBasis: this.props.dimensions.width},
        // orientationAwareStyles.apply.flexBasisFull,
        style
    ]}
    {...viewProps}
>
    <Buttons.ListDelete onPress={onDelete} />{/* iconName="user-minus" */}
    <LinearGradient
        style={{flex:1, flexGrow:1}}
        colors={['red','transparent', 'green']}
        start={{x: 0, y: .5}} end={{x: 1, y: .5}}
        locations={[0.1,0.5,0.9]}
    />
    <Buttons.ListEdit onPress={onEdit} />{/* iconName="user-edit" */}
</View>

LinearGradient опустился на один уровень вниз, используя flexGrow и flexShrink все еще не помогает, что доказывает, что это контейнер, который не обновлен с новым flexBasis

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...