对于无法在已卸载的组件上调用setState感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解或forceUpdate,并且为您提供关于cocos2d-js:调用scheduleUpdate(
对于无法在已卸载的组件上调用setState感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解或forceUpdate,并且为您提供关于cocos2d-js:调用scheduleUpdate()不执行update()方法的解决办法、cocos2d-x调用scheduleUpdate()不执行update()方法的解决办法、Flutter-从其他小部件调用setState()、jsf – Ajax update/render在已渲染属性的组件上不起作用的宝贵知识。
本文目录一览:- 无法在已卸载的组件上调用setState(或forceUpdate)(卸载时无法使用此产品安装源)
- cocos2d-js:调用scheduleUpdate()不执行update()方法的解决办法
- cocos2d-x调用scheduleUpdate()不执行update()方法的解决办法
- Flutter-从其他小部件调用setState()
- jsf – Ajax update/render在已渲染属性的组件上不起作用
无法在已卸载的组件上调用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()方法的解决办法
采用: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()方法的解决办法
转载: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()
是否有可能调用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在已渲染属性的组件上不起作用
<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}实际上是可用的。这是怎么引起的,我该如何解决呢?
解决方案是简单地引用总是渲染的父组件。
<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在已渲染属性的组件上不起作用等相关内容,可以在本站寻找。
本文标签: