• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5import 'dart:async';
6import 'dart:convert';
7
8import 'package:flutter/material.dart';
9import 'package:flutter/scheduler.dart';
10import 'package:flutter/services.dart';
11import 'package:flutter_driver/driver_extension.dart';
12
13import 'src/tests/controls_page.dart';
14import 'src/tests/text_field_page.dart';
15
16void main() {
17  timeDilation = 0.05; // remove animations.
18  enableFlutterDriverExtension(handler: dataHandler);
19  runApp(const TestApp());
20}
21
22const MethodChannel kSemanticsChannel = MethodChannel('semantics');
23
24Future<String> dataHandler(String message) async {
25  if (message.contains('getSemanticsNode')) {
26    final Completer<String> completer = Completer<String>();
27    final int id = int.tryParse(message.split('#')[1]) ?? 0;
28    Future<void> completeSemantics([Object _]) async {
29      final dynamic result = await kSemanticsChannel.invokeMethod<dynamic>('getSemanticsNode', <String, dynamic>{
30        'id': id,
31      });
32      completer.complete(json.encode(result));
33    }
34    if (SchedulerBinding.instance.hasScheduledFrame)
35      SchedulerBinding.instance.addPostFrameCallback(completeSemantics);
36    else
37      completeSemantics();
38    return completer.future;
39  }
40  throw UnimplementedError();
41}
42
43const List<String> routes = <String>[
44  selectionControlsRoute,
45  textFieldRoute,
46];
47
48class TestApp extends StatelessWidget {
49  const TestApp();
50
51  @override
52  Widget build(BuildContext context) {
53    return MaterialApp(
54      routes: <String, WidgetBuilder>{
55        selectionControlsRoute: (BuildContext context) => SelectionControlsPage(),
56        textFieldRoute: (BuildContext context) => TextFieldPage(),
57      },
58      home: Builder(
59        builder: (BuildContext context) {
60          return Scaffold(
61            body: ListView(
62              children: routes.map<Widget>((String value) {
63                return MaterialButton(
64                  child: Text(value),
65                  onPressed: () {
66                    Navigator.of(context).pushNamed(value);
67                  },
68                );
69              }).toList(),
70            ),
71          );
72        }
73      ),
74    );
75  }
76}
77