首页 > 解决方案 > 测试颤振应用

问题描述

我有一个非常简单的底部导航,如下所示:-

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(),因为在最初创建状态时已经假定状态是脏的。

如何正确执行此操作?

标签: flutterunit-testingdarttesting

解决方案


推荐阅读