- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 react-native 的新手,这不是我编写这个应用程序的人。
有人能帮我解决这个错误吗,我认为是平面列表导致了这个错误,因为只有我加载页面或搜索列表中的内容才会发生这种情况。我知道有很多关于这个错误的问题,但我没有找到适合我的解决方案。Warning: Encountered two children with the same key,
%s . Keys should be unique so that components maintain their identity across updates.
ContactScreen.js
import React from 'react';
import { Button, View, FlatList, Alert, StyleSheet, KeyboardAvoidingView } from 'react-native';
import { ListItem, SearchBar } from 'react-native-elements';
import Ionicons from 'react-native-vector-icons/Ionicons';
import { Contacts } from 'expo';
import * as Api from '../rest/api';
import theme from '../styles/theme.style';
import { Contact, ContactType } from '../models/Contact';
class ContactsScreen extends React.Component {
static navigationOptions = ({ navigation }) => {
return {
headerTitle: "Contacts",
headerRight: (
<Button
onPress={() => navigation.popToTop()}
title="Déconnexion"
/>
),
}
};
constructor(props) {
super(props);
this.state = {
contacts: [],
search: '',
isFetching: false,
display_contacts: []
}
}
async componentDidMount() {
this.getContactsAsync();
}
async getContactsAsync() {
const permission = await Expo.Permissions.askAsync(Expo.Permissions.CONTACTS);
if (permission.status !== 'granted') { return; }
const contacts = await Contacts.getContactsAsync({
fields: [
Contacts.PHONE_NUMBERS,
Contacts.EMAILS,
Contacts.IMAGE
],
pageSize: 100,
pageOffset: 0,
});
const listContacts = [];
if (contacts.total > 0) {
for(var i in contacts.data) {
let contact = contacts.data[i];
let id = contact.id;
let first_name = contact.firstName;
let middle_name = contact.middleName;
let last_name = contact.lastName;
let email = "";
if ("emails" in contact && contact.emails.length > 0) {
email = contact.emails[0].email;
}
let phone = "";
if ("phoneNumbers" in contact && contact.phoneNumbers.length > 0) {
phone = contact.phoneNumbers[0].number;
}
listContacts.push(new Contact(id, first_name, middle_name, last_name, email, phone, ContactType.UP));
}
}
const soemanContacts = await Api.getContacts();
if (soemanContacts.length > 0) {
for(var i in soemanContacts) {
let contact = soemanContacts[i];
let id = contact.contact_id.toString();
let first_name = contact.contact_first_name
let last_name = contact.contact_last_name;
let email = contact.contact_email;
let phone = contact.contact_phone.toString();
listContacts.push(new Contact(id, first_name, "", last_name, email, phone, ContactType.DOWN));
}
}
listContacts.sort((a, b) => a.name.localeCompare(b.name));
this.setState({contacts: listContacts});
this.setState({ isFetching: false });
this.updateSearch(null);
}
async addContactAsync(c) {
const contact = {
[Contacts.Fields.FirstName]: c.firstName,
[Contacts.Fields.LastName]: c.lastName,
[Contacts.Fields.phoneNumbers]: [
{
'number': c.phone
},
],
[Contacts.Fields.Emails]: [
{
'email': c.email
}
]
}
const contactId = await Contacts.addContactAsync(contact);
}
onRefresh() {
this.setState({ isFetching: true }, function() { this.getContactsAsync() });
}
updateSearch = search => {
this.setState({ search });
if(!search) {
this.setState({display_contacts: this.state.contacts});
}
else {
const res = this.state.contacts.filter(contact => contact.name.toLowerCase().includes(search.toLowerCase()));
console.log(res);
this.setState({display_contacts: res});
console.log("contact display "+ this.state.display_contacts);
}
};
toggleContact(contact) {
switch(contact.type) {
case ContactType.SYNC:
break;
case ContactType.DOWN:
this.addContactAsync(contact);
break;
case ContactType.UP:
Api.addContact(contact);
break;
}
/*Alert.alert(
'Synchronisé',
contact.name + 'est déjà synchronisé'
);*/
}
renderSeparator = () => (
<View style={{ height: 0.5, backgroundColor: 'grey', marginLeft: 0 }} />
)
render() {
return (
<View style={{ flex: 1 }}>
<KeyboardAvoidingView style={{ justifyContent: 'flex-end' }} behavior="padding" enabled>
<SearchBar
platform="default"
lightTheme={true}
containerStyle={styles.searchBar}
inputStyle={styles.textInput}
placeholder="Type Here..."
onChangeText={this.updateSearch}
value={this.state.search}
clearIcon
/>
<FlatList
data={this.state.display_contacts}
onRefresh={() => this.onRefresh()}
refreshing={this.state.isFetching}
renderItem={this.renderItem}
keyExtractor={contact => contact.id}
ItemSeparatorComponent={this.renderSeparator}
ListEmptyComponent={this.renderEmptyContainer()}
/>
</KeyboardAvoidingView>
</View>
);
}
renderItem = (item) => {
const contact = item.item;
let icon_name = '';
let icon_color = 'black';
switch(contact.type) {
case ContactType.SYNC:
icon_name = 'ios-done-all';
icon_color = 'green';
break;
case ContactType.DOWN:
icon_name = 'ios-arrow-down';
break;
case ContactType.UP:
icon_name = 'ios-arrow-up';
break;
}
return (
<ListItem
onPress={ () => this.toggleContact(contact) }
roundAvatar
title={contact.name}
subtitle={contact.phone}
//avatar={{ uri: item.avatar }}
containerStyle={{ borderBottomWidth: 0 }}
rightIcon={<Ionicons name={icon_name} size={20} color={icon_color}/>}
/>
);
}
renderEmptyContainer() {
return (
<View>
</View>
)
}
}
const styles = StyleSheet.create({
searchBar: {
backgroundColor: theme.PRIMARY_COLOR
},
textInput: {
backgroundColor: theme.PRIMARY_COLOR,
color: 'white'
}
});
export default ContactsScreen;
最佳答案
不要使用索引即时构建键。如果要构建 key ,则应尽可能在渲染之前进行。
如果您的联系人有保证的唯一 ID,您应该使用它。如果没有,您应该在数据出现在 View 中之前使用生成唯一键的函数构建一个键
示例代码:
// Math.random should be unique because of its seeding algorithm.
// Convert it to base 36 (numbers + letters), and grab the first 9 characters
// after the decimal.
const keyGenerator = () => '_' + Math.random().toString(36).substr(2, 9)
// in component
key={contact.key}
关于react-native - 我如何解决这个 : Warning: Encountered two children with the same key, `%s`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55651942/
我构建了一个自定义的 EST(指数平滑)模型。首先,我定义了一个函数,其中包含传递给第二个函数的参数定义,该函数执行计算并返回预测错误。然后将这些平方并求和。然后,最小化器应优化参数,以便最小化平方误
无法解析模板“ASClass”错误信息: This template did not produce a Java class or an interface package com.example.
我正在尝试将我的井字游戏结果输出到数据库。但是,每当两个客户端之间的匹配完成时,我都会遇到此错误。这是我的服务器端代码和错误消息的摘录: 数据库类: import java.sql.*;
我想创建一个过程来检查记录是否存在,然后更新,否则插入。但是,有一个问题我试图解决,但无法解决。请帮助。 CREATE TABLE JOB_RUN ( DATE_KEY VARCHAR2(8), JO
这是我第一次在 derby 查询中创建存储过程。我正在尝试创建一个程序。当我尝试运行查询时,出现错误 Encountered "BEGIN" 代码 CREATE PROCEDURE show_name
当我运行 pyOpenTld 时,我得到 RuntimeWarning: overflow encountered in int_scalars从这个模块。为什么会这样? Warning (from
昨晚将一个disucz论坛进行转移后,发现打开的页面上回多一个PHP has encountered a Stack overflow 这个提示错误,进过翻译为“PHP遇到堆栈溢出”。我就感觉奇怪了
我是机器学习和 numpy 的新手,我一直在尝试在来自 sklearn 的波士顿住房数据集上运行梯度下降我的实现适用于小型随机数据集,但在波士顿数据集中它会产生这些警告 :12: RuntimeWar
我正在尝试在 Windows Server 2008 上使用 TortoiseSVN checkout SVN 存储库。我在 checkout 时收到错误消息“遇到不正确的参数”,仅此而已。知道这里可
我正在尝试使用 Parsec 在 Haskell 中编写解析器。目前我有一个可以解析的程序 test x [1,2,3] end 执行此操作的代码如下 testParser = do { rese
这个问题已经有答案了: Android 8: Cleartext HTTP traffic not permitted (37 个回答) 已关闭 3 年前。 我正在 Android Studio 上构
我在 angular.js 中定义了一个空模块: angular.module('todoList', [], function () { }) 然后我想在我的 conf.js 中测试它,我加载这些j
当使用OpenJPA在内存数据库org.apache.derby中执行select语句时,遇到以下错误: javax.ejb.EJBException: The bean encountered a
我需要开始处理外来字符,在这样做的过程中,我想我真的搞砸了文件的编码。 我得到的错误是: Lexical error at line 1, column 8. Encountered: "" (0)
我试图在 Python 中创建一个 sigmoid 函数,但是,我收到以下错误: RuntimeWarning: overflow encountered in exp 这是我的代码: def sig
我有三个耦合的常微分方程,我在 python 中使用 RK4 方法在给定的初始条件下求解它们。当我运行它们时,我收到以下错误: RuntimeWarning: overflow encountered
我是 Hadoop 和 Pig 的初学者。我检查了在cloudera虚拟镜像中证明的例子,并对其进行了修改以计算前5个常用词: Lines = LOAD '/user/hue/pig/examples
我是 Python 的新手,这是我编写脚本的第一件事,我只是想知道我能做些什么来删除这个警告: Warning (from warnings module): File "C:\Users\Lur
我正在编写一个 UNIX paste 克隆。然而,我不断收到“遇到断点”消息,但 VS 不会告诉我发生在哪一行。 #include #include #define INITALLOC 16
无论我是在 Visual Studio 2017 中同步还是只是使用 Git Bash 进行推送,我都会不断收到此错误。看起来 PUSH/PULL 命令有效,但我仍然看到此错误并希望它消失。 我的 W
我是一名优秀的程序员,十分优秀!