mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
95 lines
3.0 KiB
Dart
95 lines
3.0 KiB
Dart
// Copyright 2014 The Flutter 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';
|
|
import 'package:flutter/scheduler.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:flutter_driver/driver_extension.dart';
|
|
|
|
import 'src/tests/controls_page.dart';
|
|
import 'src/tests/headings_page.dart';
|
|
import 'src/tests/popup_page.dart';
|
|
import 'src/tests/text_field_page.dart';
|
|
|
|
void main() {
|
|
timeDilation = 0.05; // remove animations.
|
|
enableFlutterDriverExtension(handler: dataHandler);
|
|
runApp(const TestApp());
|
|
}
|
|
|
|
const MethodChannel kSemanticsChannel = MethodChannel('semantics');
|
|
|
|
Future<String> dataHandler(String? message) async {
|
|
if (message != null && message.contains('getSemanticsNode')) {
|
|
final Completer<String> completer = Completer<String>();
|
|
final int id = int.tryParse(message.split('#')[1]) ?? 0;
|
|
Future<void> completeSemantics([Object? _]) async {
|
|
final dynamic result = await kSemanticsChannel.invokeMethod<dynamic>('getSemanticsNode', <String, dynamic>{
|
|
'id': id,
|
|
});
|
|
completer.complete(json.encode(result));
|
|
}
|
|
if (SchedulerBinding.instance.hasScheduledFrame) {
|
|
SchedulerBinding.instance.addPostFrameCallback(completeSemantics);
|
|
} else {
|
|
completeSemantics();
|
|
}
|
|
return completer.future;
|
|
}
|
|
if (message != null && message.contains('setClipboard')) {
|
|
final Completer<String> completer = Completer<String>();
|
|
final String str = message.split('#')[1];
|
|
Future<void> completeSetClipboard([Object? _]) async {
|
|
await kSemanticsChannel.invokeMethod<dynamic>('setClipboard', <String, dynamic>{
|
|
'message': str,
|
|
});
|
|
completer.complete('');
|
|
}
|
|
if (SchedulerBinding.instance.hasScheduledFrame) {
|
|
SchedulerBinding.instance.addPostFrameCallback(completeSetClipboard);
|
|
} else {
|
|
completeSetClipboard();
|
|
}
|
|
return completer.future;
|
|
}
|
|
throw UnimplementedError();
|
|
}
|
|
|
|
Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
|
|
selectionControlsRoute : (BuildContext context) => const SelectionControlsPage(),
|
|
popupControlsRoute : (BuildContext context) => const PopupControlsPage(),
|
|
textFieldRoute : (BuildContext context) => const TextFieldPage(),
|
|
headingsRoute: (BuildContext context) => const HeadingsPage(),
|
|
};
|
|
|
|
class TestApp extends StatelessWidget {
|
|
const TestApp({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return MaterialApp(
|
|
routes: routes,
|
|
home: Builder(
|
|
builder: (BuildContext context) {
|
|
return Scaffold(
|
|
body: ListView(
|
|
children: routes.keys.map<Widget>((String value) {
|
|
return MaterialButton(
|
|
child: Text(value),
|
|
onPressed: () {
|
|
Navigator.of(context).pushNamed(value);
|
|
},
|
|
);
|
|
}).toList(),
|
|
),
|
|
);
|
|
}
|
|
),
|
|
);
|
|
}
|
|
}
|