findProvider<P extends DataProvider> function

P? findProvider<P extends DataProvider>(
  1. BuildContext context
)

v3.x var ref = loginFormRef.info.nickNameRef;

var nickName = ref.value // get value ref.value = '123' // set value

var node = Binding.mount(context); // old dependentExecutor dispose

var binding = dataRef(node) // dataRef to binding var binding = loginFormRef.info.nickNameRef(node) // ref to binding

var nickName = binding.value // get value but no bind binding.value = '123' // set value but do not update page binding.bindChange() // get value and add dependentExecutor binding.notifyChange('123'); // set value and update page

loginFormRef.info.nickNameRef(node).bindChange() // get value and add dependentExecutor loginFormRef.info.nickNameRef(node).notifyChange('123'); // set value and update page loginFormRef.info.nickNameRef(node).value // get value but no bind loginFormRef.info.nickNameRef(node).value = '123'; // set value but do not update page

var nickName = loginFormRef.info.nickNameRef.bindChange(node: node) // get value and add dependentExecutor loginFormRef.Info.nickNameRef.notifyChange(node: node, value: '123'); // set value and update page

bindChangeNotifier(node: node, ref: loginFormRef.info.nickName, changeNotifier: changeNotifier, notifyListener: notifyListener, onChange: onChange); bindValueNotifier(node: node, ref: loginFormRef.info.nickName, valueNotifier: valueNotifier);

Implementation

P? findProvider<P extends DataProvider>(BuildContext context) {
  tryProvider(element) {
    if (element is ComponentElement) {
      if (element is StatefulElement && element.state is P) {
        return element.state as P;
      } else if (element is StatelessElement && element.widget is P) {
        return element.widget as P;
      }
    }
    return null;
  }

  P? provider;
  context.visitAncestorElements((ancestor) {
    provider = tryProvider(ancestor);
    if (provider != null) {
      return false;
    }
    return true;
  });
  return provider;
}