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
вы используете onChange
, а не onChangeText
. onChange
возвращает объект, но вы хотите, чтобы text
было помещено в строку поиска. Вам нужно обновить функцию renderHeader
, чтобы она была такой.
renderHeader = () => {
return (
this.searchFilterFunction(text)} // now we are using the correct function to capture the text
/>
);
};
Есть несколько проблем с этой функцией. Сначала вы смотрите на 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 вы должны использовать реквизит 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]
Я не юрист, но ... если вы не распространяете программу (делая ее доступной для использовать как веб-приложение не для распространения), вам не нужно ни для чего выпускать исходный код.
Значит ли это, что мне нужно освободить исходный код для моего веб-приложения?
Нет *
или просто необходимо освободить исходный код подключаемого модуля?
Если вы распространите приложение, тогда да, вы также должны распространять исходный код для его части LGPL.
Вам также необходимо убедиться, что у любого, получающего ваше приложение, будет возможность изменить его. Это важно для скомпилированных приложений - вам нужно будет включить необходимые объектные файлы, чтобы ваше приложение можно было повторно связать с измененной версией кода LGPL. Или используйте динамическое связывание. Идея состоит в том, что люди должны иметь возможность изменять часть вашего кода, которая является LGPL, и повторно комбинировать ее с вашим приложением.
Вот некоторые из требований LGPL в моих словах (я не юрист) :
Это были лишь некоторые ограничения Но LGPL также предлагает вам ряд свобод, которых нет в других лицензиях, таких как GPL. Если вы распространяете комбинированную работу, которая включает в себя чужой лицензионный код LGPL:
Недавно я написал анализ лицензии LGPL - вы можете прочитать это для получения дополнительной информации.
Также, пожалуйста, прочитайте фактический текст LGPL . Это не слишком долго.
* Вы упомянули, что используемая вами библиотека имеет источник данных GPL. Предположительно это означает, что вы на самом деле не будете распространять эти данные GPL, а только библиотеку LGPL, которая их использует.
Если под веб-приложением вы имеете в виду, что вы просто запускаете программное обеспечение на своем сервере и вы не распространяете его своим пользователям, тогда это должно быть просто. Нет распространения, нет необходимости отдавать источник.
(может отличаться от GPL3)
Чтобы быть на 100% уверенным, прочитайте FAQ и затем обратитесь к юристу, который знаком с лицензированием программного обеспечения. Не разговаривайте с юристами, которые не делают этого, потому что они скажут вам не использовать ничего бесплатно / с открытым исходным кодом, просто чтобы быть в безопасности, что каждый может сказать.
В любом случае, что вы подразумеваете под «источником данных»? что такое "GPL"? Связан ли исходный код GPL с вашим приложением?
В FAQ есть несколько вопросов относительно плагина и GPL.
Могу ли я выпустить несвободную программу это предназначено для загрузки под GPL плагин?
Это зависит от того, как программа вызывает его плагины. Например, если программа использует только простой форк и exec вызывать и общаться с плагины, то плагины отдельные программы, поэтому лицензия плагин не предъявляет никаких требований о основной программе.
Если программа динамически связывает плагины, и они делать вызовы функций друг к другу и обмениваться структурами данных, мы считаем, что они сформировать единую программу, которая должна быть рассматривается как продолжение как Основная программа и плагины. В чтобы использовать плагины под GPL, основная программа должна быть выпущена под GPL или GPL-совместимый бесплатный лицензия на программное обеспечение и условия GPL должны соблюдаться, когда Основная программа распространяется для использования с этими плагинами.
Если программа динамически связывает плагины, но общение между ними ограничено для вызова «основной» функции плагин с некоторыми опциями и ожиданием для того, чтобы вернуться, это граница случай.
Использование разделяемой памяти для взаимодействия со сложными структурами данных в значительной степени эквивалентно динамическому связыванию.
Как уже отмечали другие, веб-приложения, которые не распространяются, по-видимому, считаются частным использованием при простой GPL (не в Affero GPL?).
В компании работает модифицированный версия программы под GPL в сети сайт. GPL говорит, что они должны выпустить свои измененные источники?
GPL разрешает любому делать модифицированную версию и использовать ее, не распространяя ее среди других. То, что делает эта компания, является частным случаем этого. Поэтому компании не нужно выпускать измененные источники.
Важно, чтобы люди имели свободу вносить изменения и использовать их в частном порядке, никогда не публикуя эти изменения. Тем не менее, размещение программы на серверном компьютере для публичного общения вряд ли является «частным» использованием, поэтому было бы правомерно требовать выпуска исходного кода в этом особом случае. Разработчики, желающие решить эту проблему, могут использовать GNU Affero GPL для программ, предназначенных для использования на сетевом сервере.