flutter - 测试颤振应用
问题描述
我有一个非常简单的底部导航,如下所示:-
import 'package:blog_app/screens/create_blog_screen.dart';
import 'package:blog_app/screens/main_screen.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class Home extends StatefulWidget {
const Home({Key key}) : super(key: key);
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
int pageIndex = 0;
PageController pageController = PageController();
void changePage(int i) {
setState(() {
pageIndex = i;
pageController.jumpToPage(i);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: PageView(
onPageChanged: changePage,
children: [
const MainScreen(0),
CreateBlogScreen(),
const MainScreen(2),
],
controller: pageController,
),
bottomNavigationBar: CupertinoTabBar(
onTap: changePage,
currentIndex: pageIndex,
items: const [
BottomNavigationBarItem(
icon: Icon(Icons.home),
),
BottomNavigationBarItem(
icon: Icon(Icons.add_circle_outline),
),
BottomNavigationBarItem(
icon: Icon(Icons.list_alt_rounded),
),
],
),
);
}
}
我想测试 changePage 功能。我已经实现了一些代码:-
import 'package:flutter_test/flutter_test.dart';
import 'package:blog_app/home.dart';
void main() {
group('Navigation', () {
final home = Home();
final homeState = home.createState();
test('pageIndex should start at 0', () {
expect(homeState.pageIndex, 0);
});
test('pageIndex and pageController.page should be changed', () {
homeState.changePage(1);
expect(homeState.pageIndex, 1);
expect(homeState.pageController.page, 1);
});
});
}
但是测试失败并出现此错误
setState() 在构造函数中调用:_HomeState#d1c32(lifecycle state: created, no widget, notmounted) 当您在 State 对象上为尚未插入到小部件树中的小部件调用 setState() 时,会发生这种情况。没有必要在构造函数中调用 setState(),因为在最初创建状态时已经假定状态是脏的。
如何正确执行此操作?
解决方案
推荐阅读
- c++ - 将成员添加到作为接口的抽象类中是否是 C++ 中的一种好习惯?
- reactjs - React 钩子选择可重用组件在设置状态时丢失选项值
- sql - 从外部相同数据库 2 更新数据库 1 上的表中的字段
- if-statement - Excel ISERROR 公式返回 #VALUE!即使我使用 IF 函数返回空白
- django - 在 alpine docker 上添加 GeoDjango 依赖项
- python - 使用 ElementTree 在 XML 文件末尾找不到元素
- vb.net - 将焦点设置到另一个控件可防止当前控件值在 VB.NET 中更改
- scala - scalaexplode方法笛卡尔积多重数组
- symfony - Symfony 序列化器组件 AbstractNormalizer::CALLBACKS 非规范化
- python-3.x - 将花哨/艺术 unicode 文本转换为 ASCII