Flutter 如何在flatter中使用provider或valuenotifier将数据从子小部件传递到父小部件

Flutter 如何在flatter中使用provider或valuenotifier将数据从子小部件传递到父小部件,flutter,provider,Flutter,Provider,这是我的家长小部件 class AddUserextends StatefulWidget { final ScrollController controller; AddUser(this.controller); @override _AddUser createState() => _AddUser(); } class _AddUserToManagePropertyState extends State<AddUserToManageProp

这是我的家长小部件

class AddUserextends StatefulWidget {
  final ScrollController controller;
  AddUser(this.controller);

  @override
  _AddUser createState() =>
      _AddUser();
}

class _AddUserToManagePropertyState extends State<AddUserToManageProperty> {
  late TextEditingController _firstNameCtrl;
  late TextEditingController _lastNameCtrl;
  late TextEditingController _phoneNoCtrl;
  late ValueNotifier<num?> _category;


  final _scaffoldKey = GlobalKey<ScaffoldState>();
  final _formKey = GlobalKey<FormState>();

  final ValueNotifier<bool> _formStateEmitter = ValueNotifier(false);
  final ValueNotifier<bool> isSelected = ValueNotifier(false);

  @override
  void initState() {
    super.initState();
    _firstNameCtrl = TextEditingController(text: '');
    _lastNameCtrl = TextEditingController(text: '');
    _phoneNoCtrl = TextEditingController(text: '');

    _firstNameCtrl.addListener(() {
      _formStateEmitter.value = _fieldsStatus();
    });
    _lastNameCtrl.addListener(() {
      _formStateEmitter.value = _fieldsStatus();
    });
    _phoneNoCtrl.addListener(() {
      _formStateEmitter.value = _fieldsStatus();
    });

  }

  bool _fieldsStatus() {
    return HwValidators.required(_firstNameCtrl.text) == null &&
        HwValidators.required(_lastNameCtrl.text) == null &&
        HwValidators.required(_phoneNoCtrl.text) == null;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
      appBar: HwAppBar(
        title: 'Add team member',
      ),
      body: Form(
        key: _formKey,
        child: FormWidget(
          maintainSafeArea: false,
          showBackBtn: false,
          fields: [
            HwTextField(
              label: 'FIRST NAME',
              controller: _firstNameCtrl,
              validator: HwValidators.nameValidator,
              keyboardType: TextInputType.text,
            ),
            HwSizedBox(height: 4),
            HwTextField(
              label: 'LAST NAME',
              controller: _lastNameCtrl,
              validator: HwValidators.nameValidator,
              keyboardType: TextInputType.text,
            ),
            HwSizedBox(height: 4),
            HwTextField(
              label: 'PHONE NO',
              controller: _phoneNoCtrl,
              validator: HwValidators.phoneValidator,
              keyboardType: TextInputType.phone,
            ),
            HwSizedBox(height: 4),
            HwSizedBox(height: 4),
            HwText('ACCESS LEVEL'),
            UserAccessListTiles(),
            HwSizedBox(
              height: 4,
            ),
          ],
        ),
      ),
    );
  }
}
最后,这两个小部件
UserAccessListTileRadio()
CustomAccess()
都有一组RadioListTile,用户可以从中选择,我希望所选的选项在原始父小部件中作为表单的一部分可用


我该怎么做,请帮助。

我建议您使用状态管理,即Bloc或Provider

e、 g提供者 制作一个扩展了ChangeNotifierProvider的模型

class MyProviderModel extends ChangeNotifierProvider{
int yourChosenValue;

 void updateChosenValue() {
   // Your logic
   notifyListeners();
 }
}
父窗口小部件中的初始化提供程序

Provider(
  create: (_) => MyProviderModel(),
  child: Consumer<MyProviderModel>(
   builder: (_, a, child) {
      return // Your Form
    },
 )
)
提供程序(
创建:()=>MyProviderModel(),
儿童:消费者(
建筑商:(uu,a,child){
返回//您的表格
},
)
)
在子窗口小部件中更新MyProviderModel

context.read<MyProviderModel>().updateChosenValue();
context.read();

父窗口小部件中的Init Provider

您能告诉我父窗口小部件中的Init Provider是什么意思吗?检查编辑后的答案
Provider(
  create: (_) => MyProviderModel(),
  child: Consumer<MyProviderModel>(
   builder: (_, a, child) {
      return // Your Form
    },
 )
)