Reactネイティブで<Flastlist />
を使用してチャットを作成しようとしています
Whatsappや他のチャットアプリと同様に、メッセージは下から始まります。
APIからメッセージを取得した後、呼び出します
this.myFlatList.scrollToEnd({animated: false});
しかし、それは中央のどこかにスクロールし、時には下部にあるアイテムが少なくなり、時には何もしません。
最初に一番下までスクロールするにはどうすればよいですか?
チャットメッセージの高さが異なるため、高さを計算できません。
同様の問題がありました。下部からチャットメッセージを開始したい場合は、「inverted」をtrueに設定し、メッセージとタイムタグを反対方向に表示できます。
FlatListの「反転」プロパティについては、こちらをご覧ください。 https://facebook.github.io/react-native/docs/flatlist#inverted
チャットメッセージを先頭に表示したい場合は、これを達成しようとしています。あなたが言ったように、高さが異なるため、「scrollToEnd」が奇妙な動作をするgetItemLayoutを使用できなかったため、FlatListで解決策を見つけることができませんでした。
@My Maiが言及したアプローチに従い、代わりにScrollViewを使用し、setTimeout関数でscrollToEnd({animated:false})を実行します。さらに、scrollToEndが完了するまでコンテンツを非表示にする状態を追加したので、ユーザーにはスクロールが表示されません。
私はあなたと同じ問題に直面し、ScrollViewを使用するようになりました。修正されています:
componentDidMount() {
setTimeout(() => {
this.scrollView.scrollToEnd();
});
}
<ScrollView ref={(ref) => { this.scrollView = ref; }} style={styles.messages}>
{
messages.map((item, i) => (
<Message
key={i}
direction={item.userType === 'banker' ? 'right' : 'left'}
text={item.message}
name={item.name}
time={item.createdAt}
/>
))
}
</ScrollView>`
initialScrollIndex
をデータセットの長さ-1に設定します。
つまり.
<Flatlist
data={dataSet}
initialScrollIndex={dataSet.length - 1}
/>
RNはレイアウトを推測できないため、「移動」する必要がある量を知ることができないと推測しています。ドキュメントのスクロールメソッドによると、getItemLayout関数を実装する必要があります。そのため、RNはスクロールする必要がある量を知ることができます。
https://facebook.github.io/react-native/docs/flatlist.html#scrolltoend
最初のレンダリングでFlatListを最下部までスクロールしたい場合。 FlatListにinverted = {-1}を追加しました。私は数時間下にスクロールするのに苦労していますが、それは反転= {-1}で終わります。 getItemLayoutとinitialScrollIndexを使用してFlatListアイテムの高さを動的に測定することや、これまでのことについて考える必要はありません。