- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 StatefulWidget,它在其 initState()
中执行异步调用,以构建一个 Widget。当我手动运行它时,小部件确实会快速构建。
但是,在我的测试中,即使我使用 await tester.pump()
或 await tester.pumpAndSettle()
,小部件似乎也没有构建, 直到测试运行结束。
小部件代码:
Widget _coolWidget;
@override
void initState() {
super.initState();
_coolWidget = Container(); // If I set this to OverflowBox() my test passes
_buildWidgetFromCanvas();
}
Future<void> _buildWidgetFromCanvas() {
final ui.PictureRecorder recorder = ui.PictureRecorder();
final ui.Canvas canvas = ui.Canvas(recorder);
// ... more canvas drawing code ...
final img = ... // Image.memory() I build from the canvas
if (!mounted) {
print('no longer mounted');
return;
}
setState(() {
print(img);
_coolWidget = OverflowBox(
child: img,
);
print(_coolWidget);
});
}
测试代码:
void main() {
testWidgets('''OverflowBox shows up.''', (WidgetTester tester) async {
await _setUp(tester); // Just instantiates my widget in an app
await tester.pumpAndSettle();
expect(find.byType(OverflowBox).evaluate().length, 1);
});
}
我运行测试结果时的输出:
failed: Error caught by Flutter test framework, thrown running a test.
Expected: <1>
Actual: <0>
但如果我在 initState()
中设置 _coolWidget = OverflowBox();
,测试就会通过。
我还有其他测试在此之后运行。这些完成后,我看到打印记录了 print(img);
和 print(_coolWidget);
从上面,它正确地记录了绘制的图像。
我还得到了 no longer mounted
打印,但这只是最后一次打印,在 Flutter 内置 (tearDownAll)
之前。
在 pump() 和 pumpAndSettle() 中设置持续时间似乎没有任何改变。
我可能遗漏了一些明显的东西。
最佳答案
如果您的build
方法依赖于异步工作,请考虑使用FutureBuilder
。
Future<Image> _buildWidgetFromCanvas() {
final ui.PictureRecorder recorder = ui.PictureRecorder();
final ui.Canvas canvas = ui.Canvas(recorder);
// ... more canvas drawing code ...
if (!mounted) {
return null
}
final img = ... // Image.memory() I build from the canvas
return img;
}
FutureBuilder<Image>(
future: _buildWidgetFromCanvas, // a previously-obtained Future<Image> or null
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.active:
case ConnectionState.waiting:
return SizedBox(height: <height>, width: <width>);
case ConnectionState.done:
return OverflowBox(child: snapshot.data);
}
return null; // unreachable
},
)
您还可以像这样更新您的测试代码:
expect(find.byType(OverflowBox), findsOneWidget);
关于asynchronous - 如何在 initState() 中有异步调用的情况下测试 Flutter 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53511473/
在文档中是这样写的,但我无法理解。 Called when this object is inserted into the tree. The framework will call this me
我正在 initstate 中通过 RestAPI 创建一个企业列表。我需要使用 sharedpreference 值作为其参数之一,但是当我尝试加载数据时,sharepreference 值初始为空
看看这段代码 - 用于获取数据并显示在列表中的小部件: class _MyEventsFragmentState extends State { var events; @override
在我的应用程序中,我有一个抽屉导航,正文根据抽屉中按下的磁贴进行更新。每个类的主体都是相同的,它是一个有状态的小部件并返回一个 ListView 。对于此类的每个实例(以及每个图 block ),我需
我正在使用 initState 并遇到 Navigator 问题: I/flutter ( 5726): The following assertion was thrown building Bui
一直在学习处理flutter中的async函数。我定义了一个 async 函数,并在两个地方调用了它 1。来自 build 函数。 2.来自 initState。 当从 build 函数调用时,函数被
我想在 initState 中创建一个 TextController,然后像处理好 child 一样处理它。但出于某种原因, Controller 在 intiState 之外不可用: class _
我在 initState() 中调用异步函数,但系统实际上等待异步函数的结果。谁能告诉我为什么? 这是我的代码: import 'package:flutter/material.dart'; voi
这个问题在这里已经有了答案: Is there a way to load async data on InitState method? (14 个回答) 2个月前关闭。 Flutter - 有没有
我正在创建 TextEditingController ,并初始化它,我可以做 class _HomePageState extends State { var _controller = Tex
在多次调用的选项卡 initstate() 之间切换。 我的标签栏 A、B、C 和 D 中有 4 个标签。 情况 (1) 如果我像从选项卡 A 切换到选项卡 B 那样切换选项卡,则它工作正常。 情况
我不知道在哪里调用 super.initSate()在 flutter ?在某些代码示例中,它在开头调用,而在其他代码示例中则在结尾调用。有区别吗? 我试图用谷歌搜索,但没有找到关于这个函数调用位置的
我有以下方法: getCalendarEventList() async { print('here we go agsain'); await Firestore.instanc
我是 Flutter 的新手,遇到了一个问题。 我的应用中有一个 Feed 模型,如下所示: import 'package:uuid/uuid.dart'; class Feed { // St
在 StatefulWidget 中制作 AnimationController final 的最佳方法是什么,以下代码会出错。 final AnimationController _controll
我正在 initState(){} 中初始化一个变量: @override void initState() { getDataFromFirestore(); super.ini
我正在开发这个应用程序,您可以在其中导航到带有状态小部件的屏幕,该小部件具有在 initState() 中运行的一堆复杂函数。 由于这些功能,触发导航功能后导航到此屏幕需要将近两秒钟,即非常慢 我的代
我正在使用 Flutter 创建一个应用程序。我想从 firebase 获取数据并显示 GridView 。数据从 firebase 正确获取。 initState() 中的数据获取 但它并没有更新另
initState() 在我路由到的第一个 Widget 上被调用了两次。 我已经删除了 initState() 方法中的所有方法调用和正在完成的工作,以排除它以某种方式调用自身的任何可能性。它所做的
每次我离开一个小部件然后返回到它时,我都会收到对该小部件的 initState 方法的“n+1”次调用。 我的设置与此类似。我从小部件 A 开始,当识别到对卡片的点击时,我们执行 Navigator.
我是一名优秀的程序员,十分优秀!