Search code examples
react-nativereact-native-ui-kitten

React Native: Checkbox List Structure


A user object has an array prop schools that references one or more school objects. I would like to use a <List> with <CheckBox> to mutate the schools array.

I load the user object into the view, and I load the listOfSchools (from the application state) to generate the checkbox list:

<List data={listOfSchools} keyExtractor={ item=> item._id } renderItem={({item})=>renderItem(item)} />

The renderItem function:

const renderItem = (school) => {

    return <ListItem
        title={school.name}
        accessory={()=>renderAccessory(school)}
    />
};

The renderAccessory function:

const renderAccessory = (school) => {
    return <CheckBox checked={() => checkSchool(school._id)} onChange={()=>changeSchool(school._id)} />
}

The checkSchool function returns boolean on if the school._id is referenced in the user.schools array. The changeSchool function adds or removes the school._id from the users.schools array.

The changeSchool function:

const changeSchool = (schoolId) => {
    let checked = checkSchool(schoolId);
    if (!checked) {
        // add schoolId to user.schools
    } else {
        // remove schoolId from user.schools
    }
}

This drastically does not work. It appears that no matter what I use to mutate the state, the checkboxes never update, nor does the user.schools array mutate.

What is the proper way to structure such a design goal?


Solution

  • Assuming that you use UI Kitten, I can see that you got the checked prop value wrong for the CheckBox component.

    UI Kitten CheckBox reference

    The checked prop needs to be a boolean not a Callable as you have it there

    I would try to change the code like this:

    const renderAccessory = (school) => {
        const isChecked = checkSchool(school._id);
        return <CheckBox checked={isChecked} onChange={()=>changeSchool(school._id)} />
    }
    

    Let me know if that helped.