微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在集成测试期间意外处理小部件

如何解决在集成测试期间意外处理小部件

注意:在正常的应用程序运行中一切正常,只有在运行集成测试时才会出现问题。

我们使用的是 Flutter Channel stable 2.2.3,对于集成测试,我们使用的是 Flutter SDK 中的一个:“integration_test: sdk:颤动”

从 Screen#1 导航到 Screen#2 后通过 Navigator.of(context).pushNamed(ScreenTwo,arguments: counterProvider); 调用 Screen#1 的 dispose() 方法。 我们使用 Provider 进行状态管理,提供程序在 Screen#1 上创建并传递给 Screen#2。现在显示以下错误

错误一个 CounterProvider 在被处理后被使用。 一旦你在 CounterProvider 上调用dispose(),它就不能 不再使用。

这是因为 Screen#1 页面在导航到 Screen#2 页面后被处理。
有没有人遇到过这个问题,或者有没有人知道我们如何防止在导航后调用已处理的方法

它只在集成测试期间发生。

项目链接https://bitbucket.org/UrimGashiABC/test-dispose-issuesample/src/master/

屏幕#1 类:

class ScreenOnePage extends StatefulWidget {
  @override
  _ScreenOnePageState createState() => _ScreenOnePageState();
}

class _ScreenOnePageState extends State<ScreenOnePage> {

  @override
  Widget build(BuildContext context) {
    CounterProvider counterProvider = Provider.of<CounterProvider>(
      context,listen: true,);
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
            Text(
              'Screen #1',),SizedBox(
              height: 150,Text(
              '${counterProvider.counter}',style: Theme.of(context).textTheme.headline4,TextButton(
              key: const Key('screen_one_text_button'),onpressed: () {
                Navigator.of(context).pushNamed(ScreenTwo,arguments: counterProvider);
              },child: Text('Go to screen#2'),],floatingActionButton: FloatingActionButton(
        key: const Key('screen_one_floating_button'),onpressed: () => counterProvider.increaseCounter(),tooltip: 'Increment',child: Icon(Icons.add),//
    );
  }
}

屏幕#2 类:

class ScreenTwoPage extends StatefulWidget {
  @override
  _ScreenTwoPageState createState() => _ScreenTwoPageState();
}

class _ScreenTwoPageState extends State<ScreenTwoPage> {
  @override
  Widget build(BuildContext context) {
    CounterProvider counterProvider = Provider.of<CounterProvider>(
      context,listen: false,);
    return Scaffold(
      appBar: AppBar(),body: Container(
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: [
              Text(
                'Screen #2',key: const Key('screen_two_title'),SizedBox(
                height: 150,Text(
                'Counter: ${counterProvider.counter}',key: const Key('screen_two_counter'),);
  }
}

提供者类:

class CounterProvider extends ChangeNotifier{
    int counter = 0;

    void increaseCounter(){
      counter++;
      notifyListeners();
    }
}

测试类:

void main(){
    IntegrationTestWidgetsFlutterBinding.ensureInitialized();

    testWidgets('counter test',(WidgetTester tester) async {
      app.main();
      await tester.pumpAndSettle();
      final Finder screenOneButton = find.byKey(const Key('screen_one_text_button'));
      final Finder screenOneFloatingButton = find.byKey(const Key('screen_one_floating_button'));
      final Finder screenTwoTitle = find.byKey(const Key('screen_two_title'));
      final Finder screenTwoCounter = find.byKey(const Key('screen_two_counter'));

      await tester.tap(screenOneFloatingButton);
      await tester.tap(screenOneButton);

      await tester.pumpAndSettle();

      expect(screenTwoTitle,findsOneWidget);
    });

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。