【问题标题】:Flatlist React-Native component prevents my array from populating causing app to crashFlatlist React-Native 组件防止我的数组填充导致应用程序崩溃
【发布时间】:2020-07-30 12:54:19
【问题描述】:

我正在尝试从后端加载屏幕上的一些项目:

async function loadIncidents() {
    try {
      const response = await api.get("incidents");
      const theData = response.data;
      console.log(theData);
      setIncidents(theData);
      console.log(incidents);
    } catch (e) {
      console.error(e.message);
    }
  }

  useEffect(() => {
    loadIncidents();
  }, []);

它确实有效,我可以在日志中看到我的数据,但只有当负责呈现每个项目的平面列表没有被评论时,它才不会填充我的数组并向我显示错误:

传播不可迭代实例的尝试无效。为了 可迭代的非数组对象必须有 Symbol.iterator 方法。 - node_modules@babel\runtime\helpers\nonIterableSpread.js:2:22 在 _nonIterableSpread - node_modules@babel\runtime\helpers\toConsumableArray.js:10:111 在 _toConsumableArray * src\pages\Incidents\index.js:54:6 in Incidents - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:10696:27 在 renderWithHooks 中 - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:12842:6 在更新函数组件中 - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:307:15 在 invokeGuardedCallbackImpl - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:531:36 在调用GuardedCallback - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:20488:8 在开始工作$$1 - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:19370:24 在 performUnitOfWork - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:19347:39 在 workLoopSync - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:18997:22 在渲染根 * [本机代码]:renderRoot中的null - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:18709:28 在 runRootCallback * [本机代码]:runRootCallback 中的 null - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:5642:32 在 runWithPriority$argument_1 - 不稳定的runWithPriority中的node_modules\scheduler\cjs\scheduler.development.js:643:23 - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:5638:22 在 flushSyncCallbackQueueImpl - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:5627:28 在flushSyncCallbackQueue - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:18556:30 在 scheduleUpdateOnFiber - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:11484:17 在 dispatchAction * [本机代码]:dispatchAction 中的 null * src\pages\Incidents\index.js:29:18 在 loadIncidents - node_modules\regenerator-runtime\runtime.js:45:44 在 tryCatch - 调用中的 node_modules\regenerator-runtime\runtime.js:274:30 - node_modules\regenerator-runtime\runtime.js:45:44 在 tryCatch - 调用中的 node_modules\regenerator-runtime\runtime.js:135:28 - PromiseImpl.resolve.then$argument_0 中的 node_modules\regenerator-runtime\runtime.js:145:19 - node_modules\promise\setimmediate\core.js:37:14 在 tryCallOne - setImmediate$argument_0 中的 node_modules\promise\setimmediate\core.js:123:25
- node_modules\react-native\Libraries\Core\Timers\JSTimers.js:146:14 在 _callTimer - _callImmediatesPass 中的 node_modules\react-native\Libraries\Core\Timers\JSTimers.js:194:17 - node_modules\react-native\Libraries\Core\Timers\JSTimers.js:458:30 在 callImmediates * [本机代码]:callImmediates 中的 null - node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:407:6 在 __callImmediates - node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:143:6 在 __guard$argument_0 - node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:384:10 在 __guard - node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:142:17 在 __guard$argument_0 * [本机代码]:flushedQueue中的null * [native code]:null in callFunctionReturnFlushedQueue

警告:%s:应实现错误边界 getDerivedStateFromError()。在该方法中,将状态更新返回到 显示错误消息或回退 UI。,RootErrorBoundary - node_modules\react-native\Libraries\YellowBox\YellowBox.js:63:8 in console.error - node_modules\expo\build\environment\muteWarnings.fx.js:27:24 错误 - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:645:36 在警告WithoutStack - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:18056:16 在回调中 - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:7595:16 在回调回调 - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:7639:19 在 commitUpdateEffects - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:7630:22 在提交更新队列中 - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:17116:10 在提交生命周期中 - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:20002:23 在 commitLayoutEffects - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:307:15 在 invokeGuardedCallbackImpl - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:531:36 在调用GuardedCallback - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:19768:10 在 commitRootImpl * [本机代码]:commitRootImpl 中的 null - 不稳定的runWithPriority中的node_modules\scheduler\cjs\scheduler.development.js:643:23 - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:19590:4 在 commitRoot * [本机代码]:commitRoot 中的 null - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:18709:28 在 runRootCallback * [本机代码]:runRootCallback 中的 null - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:5642:32 在 runWithPriority$argument_1 - 不稳定的runWithPriority中的node_modules\scheduler\cjs\scheduler.development.js:643:23 - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:5638:22 在 flushSyncCallbackQueueImpl - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:5627:28 在flushSyncCallbackQueue - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:18556:30 在 scheduleUpdateOnFiber - node_modules\react-native\Libraries\Renderer\implementations\ReactNativeRenderer-dev.js:11484:17 在 dispatchAction * [本机代码]:dispatchAction 中的 null * src\pages\Incidents\index.js:29:18 在 loadIncidents - node_modules\regenerator-runtime\runtime.js:45:44 在 tryCatch - 调用中的 node_modules\regenerator-runtime\runtime.js:274:30 - node_modules\regenerator-runtime\runtime.js:45:44 在 tryCatch - 调用中的 node_modules\regenerator-runtime\runtime.js:135:28 - PromiseImpl.resolve.then$argument_0 中的 node_modules\regenerator-runtime\runtime.js:145:19 - node_modules\promise\setimmediate\core.js:37:14 在 tryCallOne - setImmediate$argument_0 中的 node_modules\promise\setimmediate\core.js:123:25
- node_modules\react-native\Libraries\Core\Timers\JSTimers.js:146:14 在 _callTimer - _callImmediatesPass 中的 node_modules\react-native\Libraries\Core\Timers\JSTimers.js:194:17 - node_modules\react-native\Libraries\Core\Timers\JSTimers.js:458:30 在 callImmediates * [本机代码]:callImmediates 中的 null - node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:407:6 在 __callImmediates - node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:143:6 在 __guard$argument_0 - node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:384:10 在 __guard r - _callImmediatesPass 中的 node_modules\react-native\Libraries\Core\Timers\JSTimers.js:194:17 - node_modules\react-native\Libraries\Core\Timers\JSTimers.js:458:30 在 callImmediates * [本机代码]:callImmediates 中的 null - node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:407:6 在 __callImmediates - node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:143:6 在 __guard$argument_0 - node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:384:10 在 __guard - node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:142:17 在 __guard$argument_0 * [本机代码]:flushedQueue中的null * [native code]:null in callFunctionReturnFlushedQueue

看起来 Flatlist 正在阻止我的函数 loadIncidents() 填充我的数组,当 Flatlist 存在并调用我的变量时,数组返回空。我尝试了几种方法来调试它,但都不起作用。 这是 Flatlist,没什么特别的:

<FlatList
     data={incidents}
     style={styles.incidentList}
     keyExtractor={(incident) => String(incident.id)}
     showsVerticalScrollIndicator={false}
     renderItem={({ item: incident }) => (
       <View style={styles.incident}>
         <Text style={styles.incidentProperty}>NGO:</Text>
         <Text style={styles.incidentValue}>{incident.name}</Text>
       </View>
     )}
 />

【问题讨论】:

    标签: javascript reactjs react-native react-native-android react-native-flatlist


    【解决方案1】:

    FlatList 应该接收数组作为数据,你得到的错误是你给了它 Object,因为你发布了你从 api 响应中得到的。

    看来你需要


     setIncidents(theData.incidents)
    

    相反。

    关于这个的另一件事


      setIncidents(theData);
      console.log(incidents)
    

    一般来说,

    SetState 是异步调用,因此记录的变量无论如何都会是前一个

    【讨论】:

    • 谢谢,你是对的,它是一个对象。我无法正确准备好 json 格式,我可能会使用 typescript 来避免这些情况,在 react native 中调试已经足够复杂了。
    • 真心推荐Reactotron 尽可能方便调试
    【解决方案2】:

    API 调用返回的数据

    > Object {   "config": Object {
    >     "adapter": [Function xhrAdapter],     
    >     "baseURL": "http://192.168.xxx.xxx:3333",
    >     "data": undefined,
    >     "headers": Object {
    >       "Accept": "application/json, text/plain, */*",
    >     },
    >     "maxContentLength": -1,
    >     "method": "get",
    >     "params": Object {
    >       "page": 1,
    >     },
    >     "timeout": 0,
    >     "transformRequest": Array [
    >       [Function transformRequest],
    >     ],
    >     "transformResponse": Array [
    >       [Function transformResponse],
    >     ],
    >     "url": "/incidents",
    >     "validateStatus": [Function validateStatus],
    >     "xsrfCookieName": "XSRF-TOKEN",
    >     "xsrfHeaderName": "X-XSRF-TOKEN",   },   "data": Object {
    >     "incidents": Array [
    >       Object {
    >         "city": "Vancouver",
    >         "description": "details of the Incident report",
    >         "email": "info@apade.ca",
    >         "id": 3,
    >         "name": "Apade",
    >         "ngo_id": "5209f9ae",
    >         "state": "BC",
    >         "title": "IR 2",
    >         "value": 110,
    >         "whatsapp": "604 123 1234",
    >       },
    >       Object {
    >         "city": "Vancouver",
    >         "description": "details of the Incident report",
    >         "email": "info@apade.ca",
    >         "id": 6,
    >         "name": "Apade",
    >         "ngo_id": "5209f9ae",
    >         "state": "BC",
    >         "title": "IR 4",
    >         "value": 120,
    >         "whatsapp": "604 123 1234",
    >       },
    >       Object {
    >         "city": "Vancouver",
    >         "description": "details of the Incident report",
    >         "email": "info@apade.ca",
    >         "id": 7,
    >         "name": "Apade",
    >         "ngo_id": "5209f9ae",
    >         "state": "BC",
    >         "title": "IR 5",
    >         "value": 120,
    >         "whatsapp": "604 123 1234",
    >       },
    >       Object {
    >         "city": "Vancouver",
    >         "description": "details of the Incident report",
    >         "email": "info@apade.ca",
    >         "id": 8,
    >         "name": "Apade",
    >         "ngo_id": "5209f9ae",
    >         "state": "BC",
    >         "title": "IR 6",
    >         "value": 120,
    >         "whatsapp": "604 123 1234",
    >       },
    >       Object {
    >         "city": "Vancouver",
    >         "description": "details of the Incident report",
    >         "email": "info@apade.ca",
    >         "id": 9,
    >         "name": "Apade",
    >         "ngo_id": "5209f9ae",
    >         "state": "BC",
    >         "title": "IR 7",
    >         "value": 120,
    >         "whatsapp": "604 123 1234",
    >       },
    >     ],   },   "headers": Object {
    >     "access-control-allow-origin": "*",
    >     "cache-control": "public, max-age=0",
    >     "connection": "keep-alive",
    >     "content-length": "1015",
    >     "content-type": "application/json; charset=utf-8",
    >     "date": "Fri, 17 Apr 2020 17:18:17 GMT",
    >     "etag": "W/\"3f7-qB7SdnrSk8xOqSo8f9RGhorMNdk\"",
    >     "x-powered-by": "Express",
    >     "x-total-count": "12",   },   "request": XMLHttpRequest {
    >     "DONE": 4,
    >     "HEADERS_RECEIVED": 2,
    >     "LOADING": 3,
    >     "OPENED": 1,
    >     "UNSENT": 0,
    >     "_aborted": false,
    >     "_cachedResponse": undefined,
    >     "_hasError": false,
    >     "_headers": Object {
    >       "accept": "application/json, text/plain, */*",
    >     },
    >     "_incrementalEvents": false,
    >     "_lowerCaseResponseHeaders": Object {
    >       "access-control-allow-origin": "*",
    >       "cache-control": "public, max-age=0",
    >       "connection": "keep-alive",
    >       "content-length": "1015",
    >       "content-type": "application/json; charset=utf-8",
    >       "date": "Fri, 17 Apr 2020 17:18:17 GMT",
    >       "etag": "W/\"3f7-qB7SdnrSk8xOqSo8f9RGhorMNdk\"",
    >       "x-powered-by": "Express",
    >       "x-total-count": "12",
    >     },
    >     "_method": "GET",
    >     "_requestId": null,
    >     "_response": "{\"incidents\":[{\"id\":3,\"title\":\"IR 2\",\"description\":\"details of the Incident
    > report\",\"value\":110,\"ngo_id\":\"5209f9ae\",\"name\":\"Apade\",\"email\":\"info@apade.ca\",\"whatsapp\":\"604
    > 123
    > 1234\",\"city\":\"Vancouver\",\"state\":\"BC\"},{\"id\":6,\"title\":\"IR
    > 4\",\"description\":\"details of the Incident
    > report\",\"value\":120,\"ngo_id\":\"5209f9ae\",\"name\":\"Apade\",\"email\":\"info@apade.ca\",\"whatsapp\":\"604
    > 123
    > 1234\",\"city\":\"Vancouver\",\"state\":\"BC\"},{\"id\":7,\"title\":\"IR
    > 5\",\"description\":\"details of the Incident
    > report\",\"value\":120,\"ngo_id\":\"5209f9ae\",\"name\":\"Apade\",\"email\":\"info@apade.ca\",\"whatsapp\":\"604
    > 123
    > 1234\",\"city\":\"Vancouver\",\"state\":\"BC\"},{\"id\":8,\"title\":\"IR
    > 6\",\"description\":\"details of the Incident
    > report\",\"value\":120,\"ngo_id\":\"5209f9ae\",\"name\":\"Apade\",\"email\":\"info@apade.ca\",\"whatsapp\":\"604
    > 123
    > 1234\",\"city\":\"Vancouver\",\"state\":\"BC\"},{\"id\":9,\"title\":\"IR
    > 7\",\"description\":\"details of the Incident
    > report\",\"value\":120,\"ngo_id\":\"5209f9ae\",\"name\":\"Apade\",\"email\":\"info@apade.ca\",\"whatsapp\":\"604
    > 123 1234\",\"city\":\"Vancouver\",\"state\":\"BC\"}]}",
    >     "_responseType": "",
    >     "_sent": true,
    >     "_subscriptions": Array [],
    >     "_timedOut": false,
    >     "_trackingName": "unknown",
    >     "_url": "http://192.168.xxx.xxx:3333/incidents?page=1",
    >     "readyState": 4,
    >     "responseHeaders": Object {
    >       "Access-Control-Allow-Origin": "*",
    >       "Cache-Control": "public, max-age=0",
    >       "Connection": "keep-alive",
    >       "Content-Length": "1015",
    >       "Content-Type": "application/json; charset=utf-8",
    >       "Date": "Fri, 17 Apr 2020 17:18:17 GMT",
    >       "ETag": "W/\"3f7-qB7SdnrSk8xOqSo8f9RGhorMNdk\"",
    >       "X-Powered-By": "Express",
    >       "X-Total-Count": "12",
    >     },
    >     "responseURL": "http://192.168.xxx.xxx:3333/incidents?page=1",
    >     "status": 200,
    >     "timeout": 0,
    >     "upload": XMLHttpRequestEventTarget {},
    >     "withCredentials": true,   },   "status": 200,   "statusText": undefined, }
    

    【讨论】:

      【解决方案3】:

      你能把整个组件的代码和事件数据的结构发过来吗? 该消息说您正在尝试传播不可迭代的实例。可能是你正在取回一个未解析的 json 对象? 如果是这样尝试使用 JSON.parse 将 json 字符串转换为 js 结构

      【讨论】:

      • 我在此处添加了代码:github.com/yamgarcia/Be-The-Hero-NGOs/blob/master/mobile/src/… 在调试时,我将第 62-64 行中的 替换为注释的第 66-91 行。只要我的 在那里,我的数组就不会填充并且我得到那个错误。我不知道为什么,但它并不总是相同:尝试获取超出范围索引 NaN 的框架 - node_modules\react-native\Libraries\Lists\VirtualizedList.js:1708:6 in _getFrameMetrics - node_modules\react-native\ _getFrameMetricsApprox 中的库\列表\VirtualizedList.js:1675:40
      • 可以发送api调用返回的数据吗?
      猜你喜欢
      • 2013-01-09
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多