在聊天应用程序中构建聊天气泡。我无法控制 ListView.builder 的 Container 子项的宽度。子容器始终采用 ListView.builders 父容器的完整宽度:
扩展 -> 容器宽度。
我想要实现的目标:消息气泡宽度尽可能小,同时仍包含消息文本,但不大于屏幕宽度的 75%。
对于这个简化的示例,忽略文本换行。
chatBubble 在哪里以及为什么会获得这个全屏宽度?
超级简化的小部件布局示例:
@override
Widget build(BuildContext context) {
return Container(
height: safeHeight,
child: Column(
children: <Widget>[
Expanded(
child: ListView.builder(
itemCount: messages.length,
itemBuilder: (ctx, i) => chatBubble(messages[i]),
)
),
Container(
height: 50,
child: TextField(/* stuff */),
)
]
)
);
}
chatBubble(Message msg) {
return Padding(
padding: EdgeInsets.all(8.0),
child: Container(
color: Colors.lightBlue,
child: Text(msg.text),
constraints: BoxConstraints(
maxWidth: screenWidth * 0.75,
),
)
)
}
Run Code Online (Sandbox Code Playgroud)
我正在努力寻找有关在我使用 Node.js 构建的函数触发器中使用从 firebase 中提取的地图的文档。每次我找到示例代码时,它都会使用我的 index.js 文件无法理解的函数。
数据库结构示例:
db.collection('users').doc('abc')
让 'abc' 保存一个名为 'uids' 的字段,该字段是一个 String、bool 的映射
我想在 Firebase 触发器函数中迭代“uids”map 以更新所有值为“false”的元素
我无法找出使用 index.js 中的地图进行任何操作/逻辑的适当方法。
这是我在网上找到的两个更连贯的片段:
db.collection('users').doc('abc').get().then((doc) => {
var uids = doc.data().uids;
//try 1
uids.forEach((value, key, map) => {
//do stuff
});
//try 2
for (var uid in uids) {
if (uid.val() == false)
//do stuff
}
});
Run Code Online (Sandbox Code Playgroud)
当搜索有关我的 index.js 代码的特定语法时,我是否错误地理解这是一个 Node.js 文件?我不明白为什么我要找到数十种方法来做同样的事情。似乎到处都张贴了完全随机的解决方案,但在我的文件中不起作用。
解决方案::感谢您的评论和回答以帮助解决此问题。我能够使用“Object.elemets(uids)”来投射 firebase 地图来提取键和值。
for (let [key, value] of Object.elements(uids)) {
//do stuff
}
Run Code Online (Sandbox Code Playgroud) javascript node.js google-cloud-functions google-cloud-firestore
构建社交媒体应用程序并应对 1write/doc/sec 限制。因此,将投票数据保留在邮寄文档中将无法大规模发挥作用。我已阅读“分布式计数器”,但文档读/写成本呈线性缩放。我一直在探索可用的 firebase 函数,并对“listDocuments()”感兴趣,它返回 DocumentReference 的列表
不幸的是,通过深入研究文档,我无法确定集合中 listDocument 的读取成本是 1 还是 1/doc。
我的计划是每个帖子有两个子集合,vote1/vote2。这大规模地消除了写入瓶颈。为了检索投票计数,我想在每个子集合上使用 listDocuments() 的长度。
我知道 firebase 有一些巧妙的索引技巧,但我也很好奇这是否是对数据库的低效操作。即用户在检索计数时会注意到延迟吗?
我正在使用 puppeteer 从网站上抓取一些图像以及一些其他数据。要更改图像,我需要将鼠标悬停在列表项上。我不断遇到有关 .hover() 的文档,但没有成功。但是, .click() 非常适合我刮擦的另一部分。
const pptr = require('puppeteer');
async function scrapeProduct(productID) {
const browser = await pptr.launch();
const page = await browser.newPage();
await page.goto(`https://someplace.com`);
let scrapeData = await page.evaluate(async () => {
let productMap = [];
//scrape other data...
const imageItems = document.querySelectorAll('ul[class="images-view-list"] > li > div');
for (let image of imageItems) {
await image.hover();
productMap.push({
'Image Src': document.querySelector('div[class="image-view-magnifier-wrap"] > img').getAttribute('src'),
});
}
return productMap;
});
await browser.close();
return scrapeData;
}
Run Code Online (Sandbox Code Playgroud)
我已经看到您通过先执行悬停来评估页面的解决方案。这很不方便,因为我收集了许多其他数据点,并希望在一个评估请求中保持我的解决方案干净。我对 .hover() 的理解不正确吗?