chainRefList function

dynamic chainRefList(
  1. List refs
)

Like chainRefs, but takes in a list of refs.

Implementation

dynamic chainRefList(List<dynamic> refs) {
  final nonNullRefs = refs.where((ref) => ref != null).toList(growable: false);

  // Wrap in an assert so iteration doesn't take place unnecessarily
  assert(() {
    nonNullRefs.forEach(_validateChainRefsArg);
    return true;
  }());

  // Return null if there are no refs to chain
  if (nonNullRefs.isEmpty) return null;

  // Pass through the ref if there's nothing to chain it with
  if (nonNullRefs.length == 1) return nonNullRefs[0];

  // Adapted from https://github.com/smooth-code/react-merge-refs/tree/v1.0.0
  //
  // Copyright 2019 Smooth Code
  //
  // Permission is hereby granted, free of charge, to any person obtaining a
  // copy of this software and associated documentation files (the 'Software'),
  // to deal in the Software without restriction, including without limitation
  // the rights to use, copy, modify, merge, publish, distribute, sublicense,
  // and/or sell copies of the Software, and to permit persons to whom the
  // Software is furnished to do so, subject to the following conditions:
  //
  // The above copyright notice and this permission notice shall be included in
  // all copies or substantial portions of the Software.
  //
  // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  // DEALINGS IN THE SOFTWARE.
  void _chainedRef(value) {
    for (final ref in nonNullRefs) {
      if (ref is Function) {
        ref(value);
      } else if (ref is Ref) {
        // ignore: invalid_use_of_protected_member
        ref.current = value;
      } else {
        // ignore: invalid_use_of_protected_member, deprecated_member_use_from_same_package
        (ref as JsRef).current = value is react.Component ? value.jsThis : value;
      }
    }
  }

  return _chainedRef;
}