我正在尝试创建一个桌面样式的滚动条,它根据内容的大小更改其大小。我的滚动条与列表共享 ScrollController,并依赖position.maxExtents 来了解内容区域有多大。
问题是,当我更改行数时,maxExtents 将不会更新,直到启动滚动事件。
我用这样的代码解决了这个问题,在 100 毫秒内向上移动 1px,向下移动 1px:
widget.controller.jumpTo(controller.position.pixels + 1);
Future.microtask(() => widget.controller.animateTo(controller.position.pixels - 1, duration: 100.milliseconds, curve: Curves.linear));
Run Code Online (Sandbox Code Playgroud)
当列表可以滚动时,它的效果非常好。但是,当列表 < 视图的高度时,它无法滚动,并且这些调用没有效果,并且我陷入了陈旧的 maxExtents 困境。
我怎样才能告诉列表:“嘿,列表,重新计算你的孩子!”?
在这个例子中,每次我按下“Click”,都会分配 50M 的内存。它永远不会被回收,我可以推送 30 个页面并占用 1.5GB,尽管导航堆栈上只有 1 个页面。GC 永远不会启动。这是怎么回事?
Flutter (Channel master, 2.1.0-11.0.pre.122, on Microsoft Windows [Version 10.0.18363.1440], locale en-US)
void main() {
runApp(MaterialApp(
home: MemoryTest(),
));
}
class MemoryTest extends StatelessWidget {
final List<EdgeInsets> insets = List.generate(
1000000,
(index) => EdgeInsets.all(0),
);
@override
Widget build(BuildContext context) {
return Container(
color: Colors.white,
child: Column(
children: [
OutlinedButton(
child: Text("CLICK"),
onPressed: () {
Navigator.of(context).pushReplacement(MaterialPageRoute(
builder: (_) => MemoryTest(),
));
},
),
],
),
);
}
}
Run Code Online (Sandbox Code Playgroud) 在 Linux 上,我们可以使用简单的 io.Process 调用来打开 url:
io.Process.run("xdg-open", [ url, ])
但尝试在 Windows 上做同样的事情
io.Process.run("start", [url]);
它失败并显示: 系统找不到指定的文件。
我猜我们需要 cmd.exe 的路径,它位于 %ComSpec%。尝试执行“echo %ComSpec%”,但出现相同的错误。也尝试过对路径进行硬编码,但没有成功。
这是我们完整的功能:
ProcessResult result;
try {
if(Platform.isLinux){
result = await io.Process.run("xdg-open", [ url, ]);
}
else if(Platform.isWindows){
result = await io.Process.run("start", [url]);
}
} on ProcessException catch (e){
Log.e(e?.message);
};
return result?.exitCode == 0;
Run Code Online (Sandbox Code Playgroud)
[编辑]更新标题以使其更准确
我有一些这样的代码:
File("foo.txt").readAsString().catchError((e)=>print(e));
编译器正在抱怨
info: The return type 'void' isn't assignable to 'FutureOr<T>', as required by 'Future.catchError'.
我似乎无法给它想要的东西,也无法在任何文档中找到一个清晰的使用示例(只是 git 中的一个很长的问题,关于有多少种错误使用它的方法)。如果我从表面上看文档,我应该能够返回一个 bool 或一个 future,两者都不会让分析器满意。
我如何提供这个 FutureOr?