Прокрутите до конца FlatList после отображения клавиатуры

У меня есть FlatList внутри KeyboardAvoidingView. Когда отображается клавиатура, я хотел бы прокрутить до конца FlatList.

Я слушаю событие "keyboardDidShow", которое запускается, но может быть запущено слишком рано, поскольку FlatList не прокручивается до конца после вызова scrollToEnd.

Я просмотрел событие onLayout KeyboardAvoidingView, но просто установка события onLayout для запуска функции, похоже, перестает изменять KeyboardAvoidingView, когда отображается клавиатура.

<KeyboardAvoidingView behavior='padding' style={{ flex: 1}} onLayout={this._scrollEnd}>

код:

import React from 'react';
import {Image, Linking, Platform, ScrollView, StyleSheet, Text, TouchableOpacity, View, Button, Alert, FlatList, TextInput, KeyboardAvoidingView, Keyboard} from 'react-native';
import { MonoText } from '../components/StyledText';

export default class HomeScreen extends React.Component {
  constructor() {
    super();
    this.state = {
      messages: getMessages()
    };

    this.keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', this._scrollEnd);
    this.keyboardDidShowListener = Keyboard.addListener('keyboardDidHide', this._scrollEnd);
  }

  _scrollEnd = (evt) => {
    this.refs.flatList1.scrollToEnd();
  }

  render() {
    return (
      <KeyboardAvoidingView behavior='padding' style={{ flex: 1}} >
        <FlatList
          style={{ flex:1}}
          ref="flatList1"
          data={this.state.messages}
          renderItem={({ item }) => <Text>{item.text}</Text>}
        />
      </KeyboardAvoidingView>
    );
  }
}

Ответы

Ответ 1

на самом деле, если вы всегда хотите прокрутить до конца, значит, вы всегда хотите увидеть последнее сообщение, правильно?

затем используйте новую версию реакции-native. и добавьте перевернутый, чтобы изменить перевернутый вниз плоский список.

<FlatList
      inverted
      style={{ flex:1}}
      ref="flatList1"
      data={this.state.messages}
      renderItem={({ item }) => <Text>{item.text}</Text>}
    />

затем переформатируйте this.state.messages вверх дном. то ваше последнее сообщение всегда будет отображаться внизу списка.

В моем случае мне не нужно использовать KeyboardAvoidingView

Ответ 2

Я создаю компонент чата, и я хочу об одном и том же. Было ли это так:

<FlatList
   ref={ref => this.flatList = ref}
   onContentSizeChange={() => this.flatList.scrollToEnd({animated: true})}
   onLayout={() => this.flatList.scrollToEnd({animated: true})}
   ...
/>

Клавиатура всплывает, запускает макет, так что исправляется. Новые сообщения о входящих сообщениях чата, а также прокрутки вниз (это то, что я хотел для моего окна чата)

Ответ 3

Как указано выше comment, getItemLayout должна решить вашу проблему.

Согласно Реактивная документация FlatList:

getItemLayout - необязательная оптимизация, которая позволяет пропустить измерение динамического содержимого, если вы знаете высоту элементов априори. getItemLayout является наиболее эффективным и прост в использовании, если у вас есть фиксированные элементы высоты, например:

getItemLayout={(data, index) => (
  {length: ITEM_HEIGHT, offset: ITEM_HEIGHT * index, index}
)}

Если вы используете ItemSeparatorComponent, не забудьте включить высоту или ширину разделителя при вычислении результирующего смещения.

Ответ 4

Проверьте эту ссылку . Надеюсь, что это сработает.