Groovy выполняет команды оболочки

1127 Это действительно хорошее начало. Однако есть несколько проблем с вашим кодом. Итак, давайте пройдемся по нему и посмотрим, где мы можем сделать некоторые улучшения.

Конструктор

Во-первых, в своем конструкторе вы делаете данные объектом, а не массивом. Плоские списки не работают с объектами, которые они работают с массивами, поэтому это немедленно вызовет у вас проблемы. Вы действительно должны удалить {} из-за restaurantList.

constructor() {
    super();
    this.state = {
        loading: false,
        data: {restaurantList}, // You shouldn't have {} around the restaurantList
        error: null,
    };
    this.arrayholder = []; // we also don't need this
}

Вы должны обновить свой конструктор до этого

constructor (props) {
  super(props);

  this.state = {
    loading: false,
    data: restaurantList, // notice we have no {} around restaurantList
    error: null,
    value: ''
  };
}

renderHeader

В вашей функции renderHeader вы используете onChange, а не onChangeText. onChange возвращает объект, но вы хотите, чтобы text было помещено в строку поиска. Вам нужно обновить функцию renderHeader, чтобы она была такой.

renderHeader = () => {
  return (
     this.searchFilterFunction(text)} // now we are using the correct function to capture the text
    />
  );
};

searchFilterFunction

Есть несколько проблем с этой функцией. Сначала вы смотрите на this.arrayholder, который пуст. На самом деле нам не нужен дополнительный массив для хранения данных, так как мы можем просто использовать restaurantList, который мы импортировали ранее. Во-вторых, вы используете indexOf для строки, лучше использовать includes.

searchFilterFunction = text => {
  this.setState({
    value: text
  });

  const newData = restaurantList.filter(item => {
    const itemData = `${item.name.toUpperCase()} ${item.type.toUpperCase()}`;
    const textData = text.toUpperCase();
    return itemData.includes(textData); // this will return true if our itemData contains the textData
  });

  this.setState({
    data: newData
  });
};

FlatList

В вашем FlatList вы должны использовать реквизит extraData, поскольку это позволит FlatList обновляться при изменении базовых данных. Вы также должны добавить keyExtractor.

 `${index}`}
  extraData={this.state} // <- add this prop
  data={this.state.data}
  renderItem={({ item }) => (
    {item.name} {item.type}
  )}
  ItemSeparatorComponent={this.renderSeparator}
  ListHeaderComponent={this.renderHeader}
/>

Собираем все вместе

Так что, если мы соберем все это вместе, добавим макет данных, чтобы мы могли проверить, работает ли он. Мы должны получить что-то вроде этого.

// mock the data as you didn't provide an example
const restaurantList = [
  {
    type: 'Italian',
    name: 'DiMaggio'
  },
  {
    type: 'Greek',
    name: 'Athena'
  }
];

export default class SearchScreen extends React.Component {
  static navigationOptions = {
    title: 'Search for Restaurants'
  };
  constructor (props) {
    super(props);

    this.state = {
      loading: false,
      data: restaurantList,
      error: null,
      value: ''
    };
  }

  renderSeparator = () => {
    return (
      
    );
  };

  searchFilterFunction = text => {
    this.setState({
      value: text
    });

    const newData = restaurantList.filter(item => {
      const itemData = `${item.name.toUpperCase()} ${item.type.toUpperCase()}`;
      const textData = text.toUpperCase();
      return itemData.includes(textData);
    });

    this.setState({
      data: newData
    });
  };

  renderHeader = () => {
    return (
       this.searchFilterFunction(text)}
      />
    );
  };

  render () {
    if (this.state.loading) {
      return (
        
          
        
      );
    } else {
      return (
        
           `${index}`}
            extraData={this.state}
            data={this.state.data}
            renderItem={({ item }) => (
              {item.name} {item.type}
            )}
            ItemSeparatorComponent={this.renderSeparator}
            ListHeaderComponent={this.renderHeader}
          />
        
      );
    }
  }
}

Закуска

Вы можете увидеть, как он работает на следующем перекусе https://snack.expo.io/@andypandy/flatlist-with-search [ 1134]

158
задан 05.05.2020, 23:39

2 ответа

Хорошо, решенный это самостоятельно;

def sout = new StringBuilder(), serr = new StringBuilder()
def proc = 'ls /badDir'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"

дисплеи:

out> err> ls: cannot access /badDir: No such file or directory

177
ответ дан 05.05.2020, 23:40
  • 1
    В случае, если также необходимо установить Переменные среды к этому процессу, удостоверьтесь, что обернули команду в оболочку. Например, выполняя команду Perforce с огибающим Варом: envVars = ["P4PORT=p4server:2222", "P4USER=user", "P4PASSWD=pass", "P4CLIENT=p4workspace"]; workDir = new File("path"); cmd = "bash -c \"p4 change -o 1234\""; proc = cmd.execute(envVars, workDir); – Noam Manos 05.05.2020, 23:40

"ls".execute() возвраты Process объект, который является почему "ls".execute().text работы. Необходимо быть в состоянии просто считать поток сообщений об ошибках, чтобы определить, были ли какие-либо ошибки.

существует дополнительный метод на Process, которые позволяют Вам передавать StringBuffer для получения текста: consumeProcessErrorStream(StringBuffer error).

Пример:

def proc = "ls".execute()
def b = new StringBuffer()
proc.consumeProcessErrorStream(b)

println proc.text
println b.toString()
42
ответ дан 05.05.2020, 23:42
  • 1
    Куда я могу импортировать дату из? – Taufiq Muhammadi 29.11.2019, 06:28

Теги

Похожие вопросы