mirror of
https://github.com/flutter/flutter
synced 2024-10-14 04:02:56 +00:00
Directionality widget (#11739)
This commit is contained in:
parent
9d4dd10f63
commit
bf47b34b60
|
@ -55,6 +55,56 @@ export 'package:flutter/rendering.dart' show
|
|||
WrapAlignment,
|
||||
WrapCrossAlignment;
|
||||
|
||||
// BIDIRECTIONAL TEXT SUPPORT
|
||||
|
||||
/// A widget that determines the ambient directionality of text and
|
||||
/// text-direction-sensitive render objects.
|
||||
///
|
||||
/// For example, [Padding] depends on the [Directionality] to resolve
|
||||
/// [EdgeInsetsDirectional] objects into absolute [EdgeInsets] objects.
|
||||
class Directionality extends InheritedWidget {
|
||||
/// Creates a widget that determines the directionality of text and
|
||||
/// text-direction-sensitive render objects.
|
||||
///
|
||||
/// The [textDirection] and [child] arguments must not be null.
|
||||
const Directionality({
|
||||
Key key,
|
||||
@required this.textDirection,
|
||||
@required Widget child
|
||||
}) : assert(textDirection != null),
|
||||
assert(child != null),
|
||||
super(key: key, child: child);
|
||||
|
||||
/// The text direction for this subtree.
|
||||
final TextDirection textDirection;
|
||||
|
||||
/// The text direction from the closest instance of this class that encloses
|
||||
/// the given context.
|
||||
///
|
||||
/// If there is no [Directionality] ancestor widget in the tree at the given
|
||||
/// context, then this will return null.
|
||||
///
|
||||
/// Typical usage is as follows:
|
||||
///
|
||||
/// ```dart
|
||||
/// TextDirection textDirection = Directionality.of(context);
|
||||
/// ```
|
||||
static TextDirection of(BuildContext context) {
|
||||
final Directionality widget = context.inheritFromWidgetOfExactType(Directionality);
|
||||
return widget?.textDirection;
|
||||
}
|
||||
|
||||
@override
|
||||
bool updateShouldNotify(Directionality old) => textDirection != old.textDirection;
|
||||
|
||||
@override
|
||||
void debugFillProperties(DiagnosticPropertiesBuilder description) {
|
||||
super.debugFillProperties(description);
|
||||
description.add(new EnumProperty<TextDirection>('textDirection', textDirection));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// PAINTING NODES
|
||||
|
||||
/// A widget that makes its child partially transparent.
|
||||
|
|
69
packages/flutter/test/widgets/directionality_test.dart
Normal file
69
packages/flutter/test/widgets/directionality_test.dart
Normal file
|
@ -0,0 +1,69 @@
|
|||
// Copyright 2015 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 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
void main() {
|
||||
testWidgets('Directionality', (WidgetTester tester) async {
|
||||
final List<TextDirection> log = <TextDirection>[];
|
||||
final Widget inner = new Builder(
|
||||
builder: (BuildContext context) {
|
||||
log.add(Directionality.of(context));
|
||||
return new Placeholder();
|
||||
}
|
||||
);
|
||||
await tester.pumpWidget(
|
||||
new Directionality(
|
||||
textDirection: TextDirection.ltr,
|
||||
child: inner,
|
||||
),
|
||||
);
|
||||
expect(log, <TextDirection>[TextDirection.ltr]);
|
||||
await tester.pumpWidget(
|
||||
new Directionality(
|
||||
textDirection: TextDirection.ltr,
|
||||
child: inner,
|
||||
),
|
||||
);
|
||||
expect(log, <TextDirection>[TextDirection.ltr]);
|
||||
await tester.pumpWidget(
|
||||
new Directionality(
|
||||
textDirection: TextDirection.rtl,
|
||||
child: inner,
|
||||
),
|
||||
);
|
||||
expect(log, <TextDirection>[TextDirection.ltr, TextDirection.rtl]);
|
||||
await tester.pumpWidget(
|
||||
new Directionality(
|
||||
textDirection: TextDirection.rtl,
|
||||
child: inner,
|
||||
),
|
||||
);
|
||||
expect(log, <TextDirection>[TextDirection.ltr, TextDirection.rtl]);
|
||||
await tester.pumpWidget(
|
||||
new Directionality(
|
||||
textDirection: TextDirection.ltr,
|
||||
child: inner,
|
||||
),
|
||||
);
|
||||
expect(log, <TextDirection>[TextDirection.ltr, TextDirection.rtl, TextDirection.ltr]);
|
||||
});
|
||||
|
||||
testWidgets('Directionality default', (WidgetTester tester) async {
|
||||
bool good = false;
|
||||
await tester.pumpWidget(new Builder(
|
||||
builder: (BuildContext context) {
|
||||
expect(Directionality.of(context), isNull);
|
||||
good = true;
|
||||
return new Placeholder();
|
||||
},
|
||||
));
|
||||
expect(good, isTrue);
|
||||
});
|
||||
|
||||
testWidgets('Directionality can\'t be null', (WidgetTester tester) async {
|
||||
expect(() { new Directionality(textDirection: null, child: new Placeholder()); }, throwsAssertionError);
|
||||
});
|
||||
}
|
Loading…
Reference in a new issue