Error: AppLoader(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null
Да возможно уже были похожие проблемы, но ещё не видел такую связанную с React Native.
MainScreen.js
import React, { useState, useEffect, useContext, useCallback } from "react";
import { View, StyleSheet, FlatList, Image, Dimensions } from "react-native";
import { AddTodo } from "../components/AddTodo";
import { Todo } from "../components/Todo";
import { THEME } from "../theme";
import { TodoContext } from "../context/todo/todoContext";
import { ScreenContext } from "../context/screen/screenContext";
import { AppLoader } from "../components/ui/AppLoader";
import { AppText } from "../components/ui/AppText";
import { AppButton } from "../components/ui/AppButton";
export const MainScreen = () => {
const { todos, addTodo, removeTodo, fetchTodos, loading, error } = useContext(
TodoContext
);
const { changeScreen } = useContext(ScreenContext);
const [deviceWidth, setDeviceWidth] = useState(
Dimensions.get("window").width - THEME.PADDING_HORIZONTAL * 2
);
const loadTodos = useCallback(async () => await fetchTodos(), [fetchTodos]);
useEffect(() => {
loadTodos();
}, []);
useEffect(() => {
const update = () => {
const width =
Dimensions.get("window").width - THEME.PADDING_HORIZONTAL * 2;
setDeviceWidth(width);
};
Dimensions.addEventListener("change", update);
return () => {
Dimensions.removeEventListener("change", update);
};
});
if (loading) {
return <AppLoader/>;
}
if (error) {
return (
<View style={styles.center}>
<AppText style={styles.error}>{error}</AppText>
<AppButton onPress={loadTodos}>Повторить</AppButton>
</View>
);
}
let content = (
<View style={{ width: deviceWidth }}>
<FlatList
keyExtractor={(item) => item.id}
data={todos}
renderItem={({ item }) => (
<Todo todo={item} onRemove={removeTodo} onOpen={changeScreen} />
)}
/>
</View>
);
if (todos.length === 0) {
content = (
<View style={styles.imgWrap}>
<Image
style={styles.img}
source={require("../../assets/no-items.png")}
/>
</View>
);
}
return (
<View>
<AddTodo onSubmit={addTodo} />
{content}
</View>
);
};
const styles = StyleSheet.create({
imgWrap: {
alignItems: "center",
justifyContent: "center",
padding: 10,
height: 300,
},
img: {
width: "100%",
height: "100%",
resizeMode: "contain",
},
center: {
flex: 1,
justifyContent: "center",
alignItems: "center",
},
error: {
fontSize: 20,
color: THEME.DANGER_COLOR,
marginBottom: 10
},
});
И ошибка возникает в рендере AppLoader
AppLoader.js
import React from "react";
import { View, StyleSheet, ActivityIndicator } from "react-native";
import { THEME } from "../../theme";
export const AppLoader = () => {
<View style={styles.center}>
<ActivityIndicator size="large" color={THEME.MAIN_COLOR} />
</View>
};
const styles = StyleSheet.create({
center: {
flex: 1,
justifyContent: "center",
alignItems: "center",
},
});
Файл MainScreen.js дальше идёт в основной шаблон и потом выходит в App.js Как исправить рендер AppLoader?
Ответы (1 шт):
Автор решения: Евгений Платов
→ Ссылка
Замените фигурные скобки на круглые, ваш компонент ничего не возвращает
export const AppLoader = () => (
<View style={styles.center}>
<ActivityIndicator size="large" color={THEME.MAIN_COLOR} />
</View>
);