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