main.dart 2.22 KB
Newer Older
1 2 3 4 5 6 7 8
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
9
import 'package:flutter/scheduler.dart';
10 11 12 13
import 'package:flutter/services.dart';
import 'package:flutter_driver/driver_extension.dart';

import 'src/tests/controls_page.dart';
14
import 'src/tests/text_field_page.dart';
15 16

void main() {
17
  timeDilation = 0.05; // remove animations.
18 19 20 21 22 23 24 25
  enableFlutterDriverExtension(handler: dataHandler);
  runApp(const TestApp());
}

const MethodChannel kSemanticsChannel = MethodChannel('semantics');

Future<String> dataHandler(String message) async {
  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 31 32 33 34 35 36 37 38
        'id': id,
      });
      completer.complete(json.encode(result));
    }
    if (SchedulerBinding.instance.hasScheduledFrame)
      SchedulerBinding.instance.addPostFrameCallback(completeSemantics);
    else
      completeSemantics();
    return completer.future;
39
  }
40
  throw UnimplementedError();
41 42 43 44
}

const List<String> routes = <String>[
  selectionControlsRoute,
45
  textFieldRoute,
46 47 48 49 50 51 52
];

class TestApp extends StatelessWidget {
  const TestApp();

  @override
  Widget build(BuildContext context) {
53
    return MaterialApp(
54
      routes: <String, WidgetBuilder>{
55 56
        selectionControlsRoute: (BuildContext context) => SelectionControlsPage(),
        textFieldRoute: (BuildContext context) => TextFieldPage(),
57
      },
58
      home: Builder(
59
        builder: (BuildContext context) {
60 61
          return Scaffold(
            body: ListView(
62
              children: routes.map<Widget>((String value) {
63 64
                return MaterialButton(
                  child: Text(value),
65 66 67 68 69 70 71 72 73 74 75 76
                  onPressed: () {
                    Navigator.of(context).pushNamed(value);
                  },
                );
              }).toList(),
            ),
          );
        }
      ),
    );
  }
}