如何获得平面清单项目的参考?

时间:2019-05-22 08:49:48

标签: react-native screenshot

我正在尝试使用react-native-view-shot捕获屏幕。按下时,this.refs.viewShot.capture显示未定义。

这是我的代码

平面列表代码:

<FlatList
                  ref={(list) => this.myFlatList = list}
                  data={this.state.newsListArray}
                  keyExtractor={this._keyExtractor}
                  renderItem={this.renderRowItem}
                />

在新闻链接上呈现:

<TouchableOpacity onPress={ () => {
                Platform.OS === 'ios' ?
                this._captureScreenIos('5c63f7307518134a2aa288ce') :
                this._captureScreenAndroid('5c63f7307518134a2aa288ce')
              }}>
                <View style={{flexDirection:'row'}}>
                  <Icon name="share-alt" size={16} color="#ffb6cf" />
                  <Text style={{paddingLeft:6,fontSize:12,fontWeight:'500'}}>Share News</Text>
                </View>
              </TouchableOpacity>

这就是功能:

_captureScreenIos = (refId) => {
    console.log("Clicked for IOS");
    this.changeLoaderStatus();
    var thisFun = this;
    var viewShotRef = 'viewShot-5c63f7307518134a2aa288ce';
     this.myFlatList.viewShot.capture({width: 2048 / PixelRatio.get(), height: 2048 / PixelRatio.get()}).then(res => {
       RNFetchBlob.fs.readFile(res, 'base64').then((base64data) => {
         console.log("base64data",base64data)
         let base64Image = `data:image/jpeg;base64,${base64data}`;
         const shareOptions = {
           title: "My Beauty Squad",
           //message: "Download my beauty squad with below link."+ "\n" + "https://itunes.apple.com/uk/app/my-beauty-squad/id1454212046?mt=8" ,
           url: base64Image,
           subject: "Share news feed"
         };
         Share.open(shareOptions);
         thisFun.changeLoaderStatus();
       })
     }).catch(error => {
       console.log(error, 'this is error');
       this.changeLoaderStatus();
     })
    }

请让我知道是否有人对此有解决方案。

**这是我的应用屏幕** enter image description here

当我们有长列表项时,它会变得模糊。 enter image description here

3 个答案:

答案 0 :(得分:1)

这是大量的代码。尝试https://reactnativecode.com/take-screenshot-of-app-programmatically/ 设置状态并尝试传入您要引用的对象。

    export default class App extends Component {

      constructor(){

        super();

        this.state={

          imageURI : 'https://reactnativecode.com/wp-content/uploads/2018/02/motorcycle.jpg'

        }
      }

      captureScreenFunction=()=>{

        captureScreen({
          format: "jpg",
          quality: 0.8
        })
        .then(
          uri => this.setState({ imageURI : uri }),
          error => console.error("Oops, Something Went Wrong", error)
        );

      }


答案 1 :(得分:1)

尝试一下:

import { captureRef } from react-native-view-shot

constructor(props) { 
   super(props); 
   this.refs = {}; 
}
renderItem = ({item, index}) => (
   <TouchableOpacity 
       onPress={ () => { 
           captureRef(this.refs[`${index}`], options).then(.....)   
       }
   > 
      <View 
        style={{flexDirection:'row'}}
        ref={shot => this.refs[`${index}`] = shot}
      >
        ...........
      </View>
   </TouchableOpacity>
)

React Native View Shot

希望对您有帮助。

答案 2 :(得分:0)

这是答案:

Array/Dictionary

这是我的功能:

constructor(props) {
  this.screenshot = {};
}

这是视图:

_captureScreenIos(itemId) {
    this.changeLoaderStatus();
    var thisFun = this;
    var viewShotRef = itemId;
     captureRef(this.screenshot[itemId],{format: 'jpg',quality: 0.8}).then(res => {
       RNFetchBlob.fs.readFile(res, 'base64').then((base64data) => {
         console.log("base64data",base64data)
         let base64Image = `data:image/jpeg;base64,${base64data}`;
         const shareOptions = {
           title: "My Beauty Squad",
           //message: "Download my beauty squad with below link."+ "\n" + "https://itunes.apple.com/uk/app/my-beauty-squad/id1454212046?mt=8" ,
           url: base64Image,
           subject: "Share news feed"
         };
         Share.open(shareOptions);
         thisFun.changeLoaderStatus();
       })
     }).catch(error => {
       console.log(error, 'this is error');
       this.changeLoaderStatus();
     })
    }