插件更新到最新版本【Error: Method 'addObserver' cannot be called on 'WidgetsBinding?' because it is potentially null. - 'WidgetsBinding' is from 'package:flutter/src/widgets/binding.dart' ('../../flutter/flutter/packages/flutter/lib/src/widgets/binding.dart'). Try calling using ?. instead. WidgetsBinding.instance.addObserver(this); ^^^^^^^^^^^】也是报错,dart版本时2.16.2
时间: 2024-02-22 12:54:45 浏览: 191
这个报错的原因是因为 `WidgetsBinding.instance` 可能为 null,而在 Dart 2.15 之后,调用可能为空的对象时,需要使用安全的调用 `?.` 运算符。因此,您需要使用以下代码来替换原来的代码:
```
WidgetsBinding.instance?.addObserver(this);
```
这应该可以解决您的问题。另外,建议您将 Dart 版本升级到最新的 2.16.3 版本,以获得更好的性能和稳定性。
相关问题
下面代码 为什么vtk窗口为黑色,没有任何图像显示: int main() { //创建vtkConeSource实例. 该实例是可视化管道(一个源过程对象). 它产生数据(输出类型为vtkPolyData),其他过滤器可以对其进行处理 vtkConeSource* cone = vtkConeSource::New(); cone->SetHeight(3.0); cone->SetRadius(1.0); cone->SetResolution(10); //创建vtkPolyDataMapper,将多边形数据映射到图形基元中. 将圆锥体源的输出 连接到此映射器的输入 vtkPolyDataMapper* coneMapper = vtkPolyDataMapper::New(); coneMapper->SetInputConnection(cone->GetOutputPort()); //创建Actor来表示圆锥体 vtkActor* coneActor = vtkActor::New(); coneActor->SetMapper(coneMapper); //创建渲染器并为其指定Actor. 渲染器就像视口,负责绘制演员 vtkRenderer* ren1 = vtkRenderer::New(); ren1->AddActor(coneActor); ren1->SetBackground(1.0, 1.0, 1.0); ren1->SetActiveCamera(ren1->GetActiveCamera()); ren1->ResetCamera(); //创建了将显示在屏幕上的渲染窗口. 使用AddRenderer将渲染器放入渲染窗口 //vtkRenderWindow* renderWindow = vtkRenderWindow::New(); vtkWin32OpenGLRenderWindow* renderWindow = vtkWin32OpenGLRenderWindow::New(); renderWindow->SetSize(500, 500); renderWindow->AddRenderer(ren1); //tkRenderWindowInteractior类监视事件. 这些事件被翻译成VTK理解的事件调用 vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New(); iren->SetRenderWindow(renderWindow); //vtkRenderWindowInteractior类监视事件(如鼠标). 这些事件被翻译成VTK理解的事件调用 vtkInteractorStyleTrackballCamera* style = vtkInteractorStyleTrackballCamera::New(); iren->SetInteractorStyle(style); //使用vtkBoxWidget来转换底层的coneAactor(通过操纵其变换矩阵) vtkBoxWidget* boxWidget = vtkBoxWidget::New(); boxWidget->SetInteractor(iren); boxWidget->SetPlaceFactor(1.25); //放置互动器。3D小部件的输入用于最初定位和缩放小部件 boxWidget->SetProp3D(coneActor); boxWidget->PlaceWidget(); vtkMyCallback* callback = vtkMyCallback::New(); boxWidget->AddObserver(vtkCommand::InteractionEvent, callback); //户按下“i”键可以使3D小部件栩栩如生. 可以户按下“i”键可以使3D小部件栩栩如生 boxWidget->On(); renderWindow->Render(); //启动事件循环 iren->Initialize(); iren->Start(); cone->Delete(); coneMapper->Delete(); coneActor->Delete(); callback->Delete(); boxWidget->Delete(); ren1->Delete(); renderWindow->Delete(); iren->Delete(); style->Delete(); return 0; }
根据您提供的代码,我注意到可能有几个原因导致窗口显示为黑色:
1. 检查是否正确设置了窗口的背景颜色。在您的代码中,渲染器的背景颜色设置为白色(`ren1->SetBackground(1.0, 1.0, 1.0);`),但这可能与窗口的背景颜色不匹配。您可以尝试将渲染器的背景颜色与窗口的背景颜色保持一致。
2. 确保已经将渲染器添加到渲染窗口中。在您的代码中,使用`renderWindow->AddRenderer(ren1);`将渲染器添加到窗口中,这是正确的步骤。
3. 确保已经设置了相机(`SetActiveCamera`和`ResetCamera`)。在您的代码中,您使用了渲染器自身的相机,但是没有明确设置相机。您可以尝试使用`vtkCamera`类来创建和设置相机,然后将相机设置为渲染器的活动相机。
4. 检查是否正确初始化了交互器和交互器样式。在您的代码中,使用了`vtkRenderWindowInteractor`和`vtkInteractorStyleTrackballCamera`类来处理交互事件。确保已经正确初始化并将它们与渲染窗口关联。
如果您仍然遇到问题,建议您检查其他可能的问题,例如VTK库的版本兼容性、操作系统和硬件要求等。如果可能,请提供更多关于您的代码和环境的信息,以便我能够更具体地帮助您解决问题。
# Set cash inside the strategy cerebro.broker = bt.brokers.BackBroker(coc=True) # 设置启动资金 cerebro.broker.setcash(10000.0) # 设置交易单位大小 # cerebro.addsizer(bt.sizers.FixedSize, stake=5000) # 设置佣金为千分之一 cerebro.broker.setcommission(commission=0.003) # 添加图表设置 cerebro.addobserver(bt.observers.Broker) cerebro.addobserver(bt.observers.Trades) cerebro.addobserver(bt.observers.DrawDown) # Set leverage #cerebro.broker.setcommission() # 添加分析指标 # 收益率 cerebro.addanalyzer(bt.analyzers.Returns, _name='_Returns') # 收益期间 cerebro.addanalyzer(bt.analyzers.TimeReturn, _name='_TimeReturn') # 计算最大回撤相关指标 cerebro.addanalyzer(bt.analyzers.DrawDown, _name='_DrawDown') # 回撤期间 cerebro.addanalyzer(bt.analyzers.TimeDrawDown, _name='_TimeDrawDown') # 计算年化夏普比率 cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='_SharpeRatio', timeframe=bt.TimeFrame.Days, annualize=True, riskfreerate=0) # 计算夏普比率 # 交易统计信息,如获胜、失败次数 cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='_TradeAnalyzer') # 运行回测 result = cerebro.run() # 输出回测结果 # 提取结果 print("--------------- 收益期间 -----------------") print(result[0].analyzers._TimeReturn.get_analysis()) print("--------------- 最大回撤相关指标 -----------------") print(result[0].analyzers._DrawDown.get_analysis()) print("--------------- 回撤期间 -----------------") print(result[0].analyzers._TimeDrawDown.get_analysis()) print(f"最终资金: {cerebro.broker.getvalue():,.2f} 元") print("收益率:",result[0].analyzers._Returns.get_analysis()['rtot']) print("夏普比率:",result[0].analyzers._SharpeRatio.get_analysis()['sharperatio']) # 绘制图表 cerebro.plot(iplot=False, style='candlestick', barup='red', bardown='green', volume=True, volup='red', voldown='green')这一代码显示IndentationError: unexpected indent
这个错误是因为代码的缩进不正确。你需要检查代码的缩进是否正确,确保每个代码块都有正确的缩进。在 Python 中,缩进是非常重要的,因为它定义了代码块的范围。以下是一个修复缩进的示例:
```
# Set cash inside the strategy
cerebro.broker = bt.brokers.BackBroker(coc=True)
# 设置启动资金
cerebro.broker.setcash(10000.0)
# 设置交易单位大小
# cerebro.addsizer(bt.sizers.FixedSize, stake=5000)
# 设置佣金为千分之一
cerebro.broker.setcommission(commission=0.003)
# 添加图表设置
cerebro.addobserver(bt.observers.Broker)
cerebro.addobserver(bt.observers.Trades)
cerebro.addobserver(bt.observers.DrawDown)
# Set leverage
#cerebro.broker.setcommission()
# 添加分析指标
# 收益率
cerebro.addanalyzer(bt.analyzers.Returns, _name='_Returns')
# 收益期间
cerebro.addanalyzer(bt.analyzers.TimeReturn, _name='_TimeReturn')
# 计算最大回撤相关指标
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='_DrawDown')
# 回撤期间
cerebro.addanalyzer(bt.analyzers.TimeDrawDown, _name='_TimeDrawDown')
# 计算年化夏普比率
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='_SharpeRatio', timeframe=bt.TimeFrame.Days, annualize=True, riskfreerate=0)
# 计算夏普比率
# 交易统计信息,如获胜、失败次数
cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='_TradeAnalyzer')
# 运行回测
result = cerebro.run()
# 输出回测结果
# 提取结果
print("--------------- 收益期间 -----------------")
print(result[0].analyzers._TimeReturn.get_analysis())
print("--------------- 最大回撤相关指标 -----------------")
print(result[0].analyzers._DrawDown.get_analysis())
print("--------------- 回撤期间 -----------------")
print(result[0].analyzers._TimeDrawDown.get_analysis())
print(f"最终资金: {cerebro.broker.getvalue():,.2f} 元")
print("收益率:",result[0].analyzers._Returns.get_analysis()['rtot'])
print("夏普比率:",result[0].analyzers._SharpeRatio.get_analysis()['sharperatio'])
# 绘制图表
cerebro.plot(iplot=False, style='candlestick', barup='red', bardown='green', volume=True, volup='red', voldown='green')
```
在这个例子中,我将代码块的缩进调整为四个空格。这是 Python 中通常使用的标准缩进。你需要确保所有代码块的缩进都是一致的,并使用相同的缩进方式,例如空格或制表符。
阅读全文