GVKun编程网logo

无法在已卸载的组件上调用setState(或forceUpdate)(卸载时无法使用此产品安装源)

12

对于无法在已卸载的组件上调用setState感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解或forceUpdate,并且为您提供关于cocos2d-js:调用scheduleUpdate(

对于无法在已卸载的组件上调用setState感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解或forceUpdate,并且为您提供关于cocos2d-js:调用scheduleUpdate()不执行update()方法的解决办法、cocos2d-x调用scheduleUpdate()不执行update()方法的解决办法、Flutter-从其他小部件调用setState()、jsf – Ajax update/render在已渲染属性的组件上不起作用的宝贵知识。

本文目录一览:

无法在已卸载的组件上调用setState(或forceUpdate)(卸载时无法使用此产品安装源)

无法在已卸载的组件上调用setState(或forceUpdate)(卸载时无法使用此产品安装源)

我正在尝试在组件更新后从服务器获取数据,但是我无法做到这一点。据我了解componentWillUnmount,组件即将销毁时会被调用,但我不需要销毁它,因此对我来说毫无用处。对此有什么解决方案?我应该何时设置状态?

async componentDidUpdate(prevProps, prevState) {  if (this.props.subject.length && prevProps.subject !== this.props.subject) {    let result = await this.getGrades({      student: this.props.id,      subject: this.props.subject    });    this.setState({      subject: this.props.subject,      grades: result    });  }}async getGrades(params) {  let response, body;  if (params[''subject''].length) {    response = await fetch(apiRequestString.gradesBySubject(params));    body = await response.json();  } else {    response = await fetch(apiRequestString.grades(params));    body = await response.json();  }  if (response.status !== 200) throw Error(body.message);  return body;}

完整错误:

Warning: Can''t call setState (or forceUpdate) on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions andasynchronous tasks in the componentWillUnmount method.

答案1

小编典典

我在这种情况下使用的一种常见模式是

componentWillUnmount() {    this.isCancelled = true;}

然后在等待异步函数解析的代码中,应在设置状态之前添加检查:

async componentDidUpdate(prevProps, prevState) {    if (this.props.subject.length && prevProps.subject !== this.props.subject) {        let result = await this.getGrades({            student: this.props.id,            subject: this.props.subject        });        !this.isCancelled && this.setState({            subject: this.props.subject,            grades: result        });    }}

这将停止已卸载/正在卸载组件上的任何状态设置

cocos2d-js:调用scheduleUpdate()不执行update()方法的解决办法

cocos2d-js:调用scheduleUpdate()不执行update()方法的解决办法

采用:
cc.director.getScheduler().scheduleUpdate(target,0,false);

参考来源:http://cocos2d.9tech.cn/news/2013/0911/28709.html

替换scheduleUpdate():

CCDirector::sharedDirector()->getScheduler()->scheduleUpdateForTarget(this,0,false);

或者:

CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(NewGame::update),this,0.1,false);


当然了,使用系统提供的update总是不那么方便,还不如自己定义自己的更新方法,在指定时间内调用,如:

schedule(schedule_selector(Potentiometer::valueChange),1);

unschedule(schedule_selector(Potentiometer::valueChange));

以及

CCDirector::sharedDirector()->getScheduler()->scheduleSelector(SEL_SCHEDULE(&Potentiometer::valueChange),this,1,false);

CCDirector::sharedDirector()->getScheduler()->unscheduleSelector(SEL_SCHEDULE(&Potentiometer::valueChange),this);

都能达到很好的效果,在间隔1s时间后,调用valueChange方法,尤其是当类的继承不为CCNode而为cclayer时,以上两种方法还是很有效果的。

cocos2d-x调用scheduleUpdate()不执行update()方法的解决办法

cocos2d-x调用scheduleUpdate()不执行update()方法的解决办法


转载:http://www.jb51.cc/article/p-xcrrrfxd-bkc.html


前两天使用到每帧都更新动画的scheduleUpdate()方法,但通过cclog,我发现,scheduleUpdate()是执行了,但update()方法并没有被调用,从网上搜下,也并没有找到好的解决方法,最后,在热心网友kaka和你用温暖的目光(非常感谢两位)的帮助下,终于找到解决办法了,办法很简单,就是用下面这句话替换scheduleUpdate()就行啦:

CCDirector::sharedDirector()->getScheduler()->scheduleUpdateForTarget(this,0,false);

或者:

CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(NewGame::update),this,0.1,false);


当然了,使用系统提供的update总是不那么方便,还不如自己定义自己的更新方法,在指定时间内调用,如:

schedule(schedule_selector(Potentiometer::valueChange),1);

unschedule(schedule_selector(Potentiometer::valueChange));

以及

CCDirector::sharedDirector()->getScheduler()->scheduleSelector(SEL_SCHEDULE(&Potentiometer::valueChange),this,1,false);

CCDirector::sharedDirector()->getScheduler()->unscheduleSelector(SEL_SCHEDULE(&Potentiometer::valueChange),this);

都能达到很好的效果,在间隔1s时间后,调用valueChange方法,尤其是当类的继承不为CCNode而为cclayer时,以上两种方法还是很有效果的。

Flutter-从其他小部件调用setState()

Flutter-从其他小部件调用setState()

是否有可能调用setState()其他部件尤其是小部件(嵌入在其它部件)的onPressed()方法,所以只能 小部件是重绘?

我想单击按钮,然后查看“ MyTextWidget”的状态进行更改。布局的其余部分相同,没有任何更改,因此不应重写。

这是我的代码:

import 'package:flutter/material.dart';
void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Timer',theme: new ThemeData(
        primaryColor: Colors.grey.shade800,),home: new MyHomePage(),);
  }
}

class MyHomePage extends StatelessWidget {

  int _seconds = 1;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("title"),body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceAround,children: <Widget>[
          MyTextWidget(),//just update this widget
          Divider(),Row(
            mainAxisAlignment: MainAxisAlignment.spaceAround,children: <Widget>[
              IconButton(
                icon: Icon(Icons.add_circle),onPressed: _addPressed,iconSize: 150.0,IconButton(
                icon: Icon(Icons.remove_circle),onPressed: ()=> print("to be implemented"),],)
        ],);
  }

  void _addPressed() {
    //somehow call _updateSeconds()
  }
}

这是我要更新的全状态MyTextWidget。

class MyTextWidget extends StatefulWidget{
  @override
  _MyTextWidgetState createState() => _MyTextWidgetState();
}

class _MyTextWidgetState extends State<MyTextWidget> {

  int secondsToDisplay = 0;

  void _updateSeconds(int newSeconds) {
    setState(() {
      secondsToDisplay = newSeconds;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Text(
      secondsToDisplay.toString(),textScaleFactor: 5.0,);
  }
}

我想要实现的目标似乎很简单,但我无法弄清楚。想象一下,如果“
MyTextWidget”埋在巨大的布局树中,并且每次我想对其进行更新时,都需要重新绘制整个树。

jsf – Ajax update/render在已渲染属性的组件上不起作用

jsf – Ajax update/render在已渲染属性的组件上不起作用

我试图ajax更新一个有条件渲染的组件。
<h:form>
    ...
    <h:commandButton value="Login" action="#{login.submit}">
        <f:ajax execute="@form" render=":text" />
    </h:commandButton>
</h:form>
<h:outputText id="text" value="You're logged in!" rendered="#{not empty user}" />

但是,这不行。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?

如果组件本身没有呈现在第一位,则不可能通过ajax重新渲染(更新)组件。必须始终在ajax可以重新呈现之前呈现组件。 Ajax正在使用JavaScript document.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。

解决方案是简单地引用总是渲染的父组件。

<h:form>
    ...
    <h:commandButton ...>
        <f:ajax ... render=":text" />
    </h:commandButton>
</h:form>
<h:panelGroup id="text">
    <h:outputText ... rendered="#{not empty user}" />
</h:panelGroup>

也可以看看:

> Why do I need to nest a component with rendered=”#{some}” in another component when I want to ajax-update it?
> How to find out client ID of component for ajax update/render? Cannot find component with expression “foo” referenced from “bar”

关于无法在已卸载的组件上调用setState或forceUpdate的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于cocos2d-js:调用scheduleUpdate()不执行update()方法的解决办法、cocos2d-x调用scheduleUpdate()不执行update()方法的解决办法、Flutter-从其他小部件调用setState()、jsf – Ajax update/render在已渲染属性的组件上不起作用等相关内容,可以在本站寻找。

本文标签: