react-native-draggable-flatlist 在 ScrollView 中不起作用

Posted

技术标签:

【中文标题】react-native-draggable-flatlist 在 ScrollView 中不起作用【英文标题】:react-native-draggable-flatlist not working inside ScrollView 【发布时间】:2020-09-25 16:12:16 【问题描述】:

过去几个月我一直在努力实现一个要求,即我在单个滚动视图中有一个可拖动的平面列表和一个平面列表,并且我应该能够滚动整个内容。

可拖动的平面列表也应该具有自动滚动功能,这意味着当列表太长并且我试图将其拖出视口时,除非我放下它,否则列表应该自动滚动。

我知道这个要求非常棘手,但我没有任何线索让它完全工作。

我正在使用下面的代码,并且为此目的使用了 'react-native-draggable-flatlist'(https://github.com/computerjazz/react-native-draggable-flatlist)。

代码:

import React from 'react';
import 
  SafeAreaView,
  StyleSheet,
  ScrollView,
  View,
  Text,
  StatusBar,
  TouchableOpacity
 from 'react-native';

import 
  Header,
  LearnMoreLinks,
  Colors,
  DebugInstructions,
  ReloadInstructions,
 from 'react-native/Libraries/NewAppScreen';
import DraggableFlatList from 'react-native-draggable-flatlist'
import  Component  from 'react'

const exampleData = [...Array(20)].map((d, index) => (
  key: `item-$index`, // For example only -- don't use index as your key!
  label: index,
  backgroundColor: `rgb($Math.floor(Math.random() * 255), $index *
  5, $132)`
));

class App extends Component 
  state = 
    data: exampleData,
    scrollEnabled: true
  ;
  onEnableScroll = (value: boolean) => 
    this.setState(
      enableScrollViewScroll: value,
    );
  ;

  renderItem = ( item, index, drag, isActive ) => 
    return (
      <TouchableOpacity
        style=
          height: 100,
          backgroundColor: isActive ? "blue" : item.backgroundColor,
          alignItems: "center",
          justifyContent: "center"
        
        onLongPress=drag
      >
        <Text
          style=
            fontWeight: "bold",
            color: "white",
            fontSize: 32
          
        >
          item.label
        </Text>
      </TouchableOpacity>
    );
  ;

  render() 
    return (
      <ScrollView
        style= backgroundColor: '#000', flex: 1 
        contentContainerStyle= paddingTop: 800, paddingBottom: 100 
        scrollEnabled=this.state.scrollEnabled
      >
        <DraggableFlatList
          data=this.state.data
          renderItem=this.renderItem
          keyExtractor=(item, index) => `draggable-item-$item.key`
          onMoveBegin=() => this.setState( scrollEnabled: false )
          onMoveEnd=( data ) => 
            this.setState( scrollEnabled: true, data );
          
        />

        <FlatList
          data=this.state.data
          renderItem=this.renderItem
          keyExtractor=(item, index) => `draggable-item-$item.key`
        />

      </ScrollView>
    );
  


const styles = StyleSheet.create(
  scrollView: 
    backgroundColor: Colors.lighter,
  ,
  engine: 
    position: 'absolute',
    right: 0,
  ,
  body: 
    backgroundColor: Colors.white,
  ,
  sectionContainer: 
    marginTop: 32,
    paddingHorizontal: 24,
  ,
  sectionTitle: 
    fontSize: 24,
    fontWeight: '600',
    color: Colors.black,
  ,
  sectionDescription: 
    marginTop: 8,
    fontSize: 18,
    fontWeight: '400',
    color: Colors.dark,
  ,
  highlight: 
    fontWeight: '700',
  ,
  footer: 
    color: Colors.dark,
    fontSize: 12,
    fontWeight: '600',
    padding: 4,
    paddingRight: 12,
    textAlign: 'right',
  ,
);

export default App;

【问题讨论】:

您找到解决方案了吗?我面临这个问题 @QuangThái - 还没有 【参考方案1】:

您应该使用ListFooterComponentListHeaderComponent 方法来渲染项目。

请像下面的代码一样更改您的渲染方法。

render() 
      return (
        <View
          style= backgroundColor: '#000', flex: 1 
        >
          <DraggableFlatList
            data=this.state.data
            renderItem=this.renderItem
            keyExtractor=(item, index) => `draggable-item-$item.key`
            onMoveBegin=() => this.setState( scrollEnabled: false )
            onMoveEnd=( data ) => 
              this.setState( scrollEnabled: true, data );
            
            ListFooterComponent=() => 
              return <View>
                <FlatList
                  data=this.state.data
                  renderItem=this.renderItem
                  keyExtractor=(item, index) => `draggable-item-$item.key`
                />
              </View>
            
          />
        </View>
      );

【讨论】:

以上是关于react-native-draggable-flatlist 在 ScrollView 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章