在 Flutter 中,所有Navigator将新元素推送到导航堆栈的函数都会返回 a Future,因为调用者可以等待执行并处理结果。
我大量使用它,例如将用户(通过push())重定向到新页面时。当用户完成与该页面的交互时,我有时还希望原始页面pop():
onTap: () async {
await Navigator.of(context).pushNamed(
RoomAddPage.routeName,
arguments: room,
);
Navigator.of(context).pop();
},
Run Code Online (Sandbox Code Playgroud)
一个常见的示例是使用带有敏感操作(例如删除实体)的按钮的底部工作表。当用户单击该按钮时,将打开另一个底部工作表,要求确认。当用户确认时,确认对话框以及打开确认底部表单的第一个底部表单将被关闭。
所以基本上onTap底部工作表内的“删除”按钮的属性如下所示:
onTap: () async {
bool deleteConfirmed = await showModalBottomSheet<bool>(/* open the confirm dialog */);
if (deleteConfirmed) {
Navigator.of(context).pop();
}
},
Run Code Online (Sandbox Code Playgroud)
这种方法一切都很好。我遇到的唯一问题是 linter 发出警告:use_build_context_synchronouslyBuildContext ,因为我在函数完成后使用相同的警告async。
我忽略/暂停此警告是否安全?但是,我如何使用相同的后续代码等待导航堆栈上的推送操作BuildContext?有合适的替代方案吗?一定有可能做到这一点,对吧?
PS:我不能也不想检查该mounted属性,因为我没有使用StatefulWidget.
我的目标是拥有一个网站的形象(是的,就这么简单).我知道有像html2canvas这样的工具.但是,我不希望客户端浏览器呈现屏幕截图.
一个原因是我使用带有webview的chrome扩展,其基本上与行为相似iFrame.出于安全原因,为包含其的网站呈现屏幕截图iFrame不起作用.
我也知道他们正致力于本机支持捕获网站截图,但我想要一个跨浏览器解决方案而不依赖于浏览器的可能性.所有这些都发生在服务器上,所以它应该可以通过命令行执行.
我现在正在做的是:
在这个基本级别进行操作的缺点是图像包含状态栏,浏览器插件等等.实际上我只想拥有实际的网站内容而没有所有这些特定于应用程序的东西.
最好的事情是命令行工具,它以某种方式让我确定我想要捕获图像的应用程序的哪个部分.
一个例子是这个插件的Firefox或该服务器端工具或所有这些工具提供不同的浏览器和操作系统喜欢的网站截图这样.我想知道他们如何摆脱浏览器特定的GUI元素.
增加:
我不知道我是否足够清楚,但我想要一个特定浏览器内容的截图,但没有浏览器特定的GUI元素.这意味着运行无头浏览器的应用程序对我没用.因为无头浏览器有自己的引擎.我特别希望有一个例如Firefox版本x的屏幕截图.
javascript screenshot google-chrome image-processing webpage-screenshot
我处于收到客户留言的情况.在处理该请求的函数内(@socketio.on)我想调用一个完成一些繁重工作的函数.这不应该导致阻塞主线程,并且一旦工作完成就认为客户端被通知.因此,我开始一个新的线程.
现在我遇到了一个非常奇怪的行为:消息永远不会到达客户端.但是,代码到达发送消息的特定位置.更令人惊讶的是,如果线程中没有任何事情发生,除了消息被发送到客户端,那么答案实际上找到了通往客户端的方式.
总结一下:如果在发送消息之前发生了计算密集的事情,那么它就不会被传递,否则就是.
就像在这里和这里说的那样,从一个线程向客户端发送消息根本不是问题:
在此之前显示的所有示例中,服务器响应客户端发送的事件.但对于某些应用程序,服务器需要是消息的发起者.这对于向客户端发送通知在服务器中发起的事件(例如在后台线程中)非常有用.
这是一个示例代码.删除注释符号(#)时,消息('foo from thread')找不到客户端,否则就会找到.
from flask import Flask
from flask.ext.socketio import SocketIO, emit
app = Flask(__name__)
socketio = SocketIO(app)
from threading import Thread
import time
@socketio.on('client command')
def response(data):
thread = Thread(target = testThreadFunction)
thread.daemon = True
thread.start()
emit('client response', ['foo'])
def testThreadFunction():
# time.sleep(1)
socketio.emit('client response', ['foo from thread'])
socketio.run(app)
Run Code Online (Sandbox Code Playgroud)
我使用的是Python 3.4.3,Flask 0.10.1,flask-socketio1.2,eventlet 0.17.4.
可以将此示例复制并粘贴到.py文件中,并且可以立即重现该行为.
有人可以解释这种奇怪的行为吗?
更新
这似乎是eventlet的一个bug.如果我做:
socketio = SocketIO(app, async_mode='threading')
Run Code Online (Sandbox Code Playgroud)
它会强制应用程序在安装时不使用eventlet.
但是,对于我来说这不是一个适用的解决方案,因为使用'threading'async_mode拒绝接受二进制数据.每当我从客户端向服务器发送一些二进制数据时,它会说:
WebSocket transport not available. Install eventlet or …
我有一个html文件,其中有几个d3图直接用脚本标签写入其中.当我将其中一个图表外包到外部js文件中时,我收到此消息"NS_ERROR_DOM_BAD_URI:访问受限制的URI被拒绝".如果我用d3.json删除代码,它读取本地json文件,则错误消失.但是必须能够将json文件加载到嵌入到html中的外部js中,对吗?
d3.json("forcetree.json", function(json) {
root = json;
update();
});
Run Code Online (Sandbox Code Playgroud) 我有以下情况:我在socketio服务器上收到请求.我回答它(socket.emit(..))然后在另一个线程中启动一些计算负载很重的东西.
如果繁重的计算是由subprocess.Popen(使用subprocess.PIPE)引起的,它会完全阻止每个传入的请求,只要它正在被执行,尽管它发生在一个单独的线程中.
没问题 - 在这个线程中,建议异步读取子进程的结果,缓冲区大小为1,以便在这些读取之间,其他线程有机会做某事.不幸的是,这对我没有帮助.
我也已经monkeypatched eventlet和工作正常-只要我不使用subprocess.Popen与subprocess.PIPE在线程.
在此代码示例中,您可以看到它只在使用subprocess.Popen时发生subprocess.PIPE.当取消注释#functionWithSimulatedHeavyLoad()并反而评论functionWithHeavyLoad()一切都像魅力一样.
from flask import Flask
from flask.ext.socketio import SocketIO, emit
import eventlet
eventlet.monkey_patch()
app = Flask(__name__)
socketio = SocketIO(app)
import time
from threading import Thread
@socketio.on('client command')
def response(data, type = None, nonce = None):
socketio.emit('client response', ['foo'])
thread = Thread(target = testThreadFunction)
thread.daemon = True
thread.start()
def testThreadFunction(): …Run Code Online (Sandbox Code Playgroud) 我的计划是从纸上绘制的平面图中提取信息.我已经设法检测到70-80%的拉门:

现在我想从墙上创建一个数据模型.我已经设法提取它们,你可以在这里看到:
从那我创造了轮廓:
我现在的想法是从该图像中获取线条的交叉点并从中创建数据模型.但是,如果我使用houghlines算法,我得到这样的东西:
有人对如何获得交叉点或甚至另一个想法如何获得模型有不同的想法?会很好的.
PS:我正在使用javacv.但是opencv中的算法也可以正常,因为我可以翻译它.
我已经google了一段时间,无法找到适合当前Gitlab UI的解决方案.我正在尝试删除我之前在Gitlab上创建的存储库.我通过单击右侧的设置cog 导航到编辑项目.向下滚动到底部后,我找不到名为remove project的部分.相反,我只看到重命名项目.我应该拥有适当的权利,因为我是项目的主人.
有任何想法吗?
我有以下问题:现在 PlayStore 中有一个应用程序是用本机代码(iOS 和 Android)编写的,我正计划迁移到 Flutter。我的目标是用户不会注意到引擎盖下的变化,但可以像以前一样继续使用该应用程序。为此,我还需要迁移共享首选项。然而,这是相当困难的。在原生 Android 应用程序中,我像这样存储了相关的共享首选项:
SharedPreferences sharedPrefs = context.getSharedPreferences(
"storage",
Context.MODE_PRIVATE
);
sharedPrefs.putString('guuid', 'guuid_value');
editor.apply();
Run Code Online (Sandbox Code Playgroud)
这会导致在此路径上创建一个文件:
/data/data/patavinus.patavinus/shared_prefs/storage.xml
Run Code Online (Sandbox Code Playgroud)
有了这个内容:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<int name="guuid" value="guuid_value" />
</map>
Run Code Online (Sandbox Code Playgroud)
如果我在 Flutter 中使用 shared_prefences 通过这样做来获取这个值:
final sharedPreferences = await SharedPreferences.getInstance();
sharedPreferences.getString('guuid');
Run Code Online (Sandbox Code Playgroud)
它返回 null 因为它寻找
/data/data/patavinus.patavinus/shared_prefs/FlutterSharedPreferences.xml这是在 Flutter 中使用 shared_preferences 存储共享首选项时写入的文件。因为共享首选项是在本机应用程序上下文中编写的,该文件显然不存在。
有没有什么方法可以让 Flutter 去寻找/data/data/patavinus.patavinus/shared_prefs/storage.xml而不必使用平台通道?
我知道这是如何工作的,就像这里提到的那样:How to access flutter Shared preference on the android end (using java)。这种方式很简单,因为在 Android 中你可以选择在 Flutter 的前缀前面加上。但是,在 Flutter 中你不能。
我也知道这个插件:https : …
migration sharedpreferences flutter flutter-platform-channel
我正在开发一个应用程序,用于比较不同浏览器中呈现的DOM,以便找到差异.我将其视为进行屏幕截图比较的替代方案.此外,这可以通过编程方式完成,减少误报(至少这是我的想法).
我通过element.getBoundingClientRect()计算元素的实际位置,如下所示:检索html元素的位置xy.
我在Firefox和Chrome上尝试过,并从中生成了一个JSON DOM结构.现在我对我得到的东西感到很困惑.我知道浏览器在子像素级别上处理像素值的方式不同,但它并不像Chrome总是有圆形数字而Firefox总是有分数.它几乎总是这样:
火狐
{
"name": "SPAN",
"style": {
"display": "block",
"top": "1390.5",
"left": "824.61669921875",
"width": "123.38333129882812",
"height": "27"
}
}
Run Code Online (Sandbox Code Playgroud)
铬
{
"name": "SPAN",
"style": {
"display": "block",
"top": "1390",
"left": "824.640625",
"width": "123.359375",
"height": "27"
}
}
Run Code Online (Sandbox Code Playgroud)
chrome中的最高值始终是整数,而在firefox中,它始终是相同的值,但要高出.5或.25.
高度要比铬高1或0.5.
所有其他值有时是两个浏览器中的分数.如果它们是分数,它们永远不会相等(firefox总是具有更高的值).如果它们是整数,则它们是相同的.
我从来没有想到过这样的事情.特别是顶部和高度值的奇怪之处.我会想,渲染只是不同,这导致(不规则!!)不同的像素值.
所以我的问题是:如果我进行这种比较,我可以从中得出任何规则吗?有谁知道firefox的舍入规则?或者我是否必须进行宽容比较,以检查这些值是否相互间隔超过1个单位?
更新:
如果您想快速查看,请访问http://example.com/(因为它有一个非常小的DOM)并document.getElementsByTagName("body")[0].getBoundingClientRect()在firefox和chrome上输入javascript控制台.Y,高度和顶部值在firefox中是疯狂的长浮点值,而在它们中更短并且在chrome中奇怪地舍入.
我有一张在Google上找到的图片.我的目的是用该样本图像训练GOCR,然后用我获得的知识重现结果.我用了
gocr -i /tmp/scanned2.jpg -m 2 -p /home/marc/.db/ -m 256 -m 130
Run Code Online (Sandbox Code Playgroud)
训练它.-m 2使用个人数据库,-p指定它所在的位置,-m 256忽略通常的ocr数据库,-m 130进行交互式训练.在我完成训练后(这真的需要很长时间才能完成)我看了一下结果并且没问题.但是当我尝试重用我的数据库时,它似乎不起作用.我用的时候
gocr -i /tmp/scanned2.jpg -m 2 -p /home/marc/.db/ -m 256
Run Code Online (Sandbox Code Playgroud)
这实际上是与上面相同的命令,只是没有数据库的交互式训练,它不能识别我在上一次训练中训练GOCR的许多事情.难道它不应该产生与我训练时得到的结果相同的结果吗?
我的系统是Linux Mint 3.16.0-38.我通过apt-get安装了GOCR并拥有最新版本.