// Copyright 2019 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 '../widgets/framework.dart'; /// Indicates the visual level for a piece of content. Equivalent to `UIUserInterfaceLevel` /// from `UIKit`. /// /// See also: /// /// * `UIUserInterfaceLevel`, the UIKit equivalent: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel. enum CupertinoUserInterfaceLevelData { /// The level for your window's main content. base, /// The level for content visually above [base]. elevated, } /// Establishes a subtree in which [CupertinoUserInterfaceLevel.of] resolves to /// the given data. /// /// Querying the current elevation status using [CupertinoUserInterfaceLevel.of] /// will cause your widget to rebuild automatically whenever the [CupertinoUserInterfaceLevelData] /// changes. /// /// If no [CupertinoUserInterfaceLevel] is in scope then the [CupertinoUserInterfaceLevel.of] /// method will throw an exception, unless the `nullOk` argument is set to true, /// in which case it returns null. /// /// See also: /// /// * [CupertinoUserInterfaceLevelData], specifies the visual level for the content /// in the subtree [CupertinoUserInterfaceLevel] established. class CupertinoUserInterfaceLevel extends InheritedWidget { /// Creates a [CupertinoUserInterfaceLevel] to change descendant Cupertino widget's /// visual level. const CupertinoUserInterfaceLevel({ Key key, @required CupertinoUserInterfaceLevelData data, Widget child, }) : assert(data != null), _data = data, super(key: key, child: child); final CupertinoUserInterfaceLevelData _data; @override bool updateShouldNotify(CupertinoUserInterfaceLevel oldWidget) => oldWidget._data != _data; /// The data from the closest instance of this class that encloses the given /// context. /// /// You can use this function to query the user interface elevation level within /// the given [BuildContext]. When that information changes, your widget will /// be scheduled to be rebuilt, keeping your widget up-to-date. static CupertinoUserInterfaceLevelData of(BuildContext context, { bool nullOk = false }) { assert(context != null); assert(nullOk != null); final CupertinoUserInterfaceLevel query = context.inheritFromWidgetOfExactType(CupertinoUserInterfaceLevel); if (query != null) return query._data; if (nullOk) return null; throw FlutterError( 'CupertinoUserInterfaceLevel.of() called with a context that does not contain a CupertinoUserInterfaceLevel.\n' 'No CupertinoUserInterfaceLevel ancestor could be found starting from the context that was passed ' 'to CupertinoUserInterfaceLevel.of(). This can happen because you do not have a WidgetsApp or ' 'MaterialApp widget (those widgets introduce a CupertinoUserInterfaceLevel), or it can happen ' 'if the context you use comes from a widget above those widgets.\n' 'The context used was:\n' ' $context' ); } }