【问题标题】:Flutter : initial value not updating in Form (FormBuilder)Flutter:初始值未在表单中更新(FormBuilder)
【发布时间】:2021-01-04 13:52:48
【问题描述】:
 _updatePersonalFormScreen(String loginId) async {
    if (!DartUtility.isNullEmptyOrWhitespace(loginId)) {
      _personalInfo = await _service.getUserPersonalDetails(loginId);
      setState(() {
        if (_personalInfo != null) {
          if(!DartUtility.isNullEmptyList(_personalInfo.getContacts())){
            contactList = _personalInfo.getContacts();
          }     
          personalInfoMap = _personalInfo.toPersonalInfoMap();
        }
        print('personalInfo retrieved object ${_personalInfo.toString()}');   //1
      });
    }     
  }

formBuilder 小部件:

  FormBuilder buildFormBuilder(BuildContext context) {
    print('personalInfoMap $personalInfoMap');         //2
    return FormBuilder(
          key: _personalDetailFormKey,
          initialValue: personalInfoMap,               //3
          autovalidate: true,
          child: Stack(),
        );
  }

//第 1 行和第 2 行打印正确的值,但在第 3 行,初始值未分配给表单构建器文本框

'contactList' 正在正确填充,但在填充 'personalInfoMap' 的同一块中未按预期正常工作 或者可能在第 3 行分配的值需要修改其他内容才能使其工作

我也尝试过与 Future builder 合作,但没有运气。如果“contactList”工作正常并分配给表单值,那么为什么要在其他领域面临问题? :(

有人可以帮我解决这个问题,这里还需要做什么以及哪里出错了。

【问题讨论】:

    标签: flutter flutter-futurebuilder flutter-form-builder


    【解决方案1】:

    经过4个5小时的奋斗,终于解决了,救星是“未来的建设者”。 这是解决方案,

    在构建方法中不直接调用FormBuilder,而是将其包装在FutureBuilder中

    @override
      Widget build(BuildContext context) =>SafeArea(
            child: Scaffold(
              body: Container(
                height: MediaQuery.of(context).size.height,
                child: FutureBuilder(
                  future: _getPersonalInfoFormInitialValue(),
                  builder: (context, snapshot) => snapshot.hasData
                      ? buildFormBuilder(context, snapshot.data) // this provide returned data from _getPersonalInfoFormInitialValue()
                      : const SizedBox(),
                ),
              ),
            ),
          );
    

    修改了 formBuilder 小部件:

    FormBuilder buildFormBuilder(BuildContext context, data) {
        print('datat ::::$data');
            return FormBuilder(
              key: _personalDetailFormKey,
              initialValue:data,               //assigned fetched data
              autovalidate: true,
              child: Stack(), 
          );
      }
    

    【讨论】:

      【解决方案2】:

      似乎无法更改最初加载的值,_formKey 仍保留在内存中。所以我们需要防止第一次用null初始化

      我用reverpod和flutter形式下面是watch粗略实现的相关代码

      Widget build(
          BuildContext context,
          ScopedReader watch,
        ) {
          final loginId = context.read(selectedLoginId).state; // user id to check if there is a valid data
              final user = watch(selectedUser).data?.value; // getting user info we need both
             
              return Padding(
                padding: const EdgeInsets.all(32.0),
                child: Column(
                  children: [
                    (loginId != null && user == null)
                        ? CircularProgressIndicator()
                        : FormBuilder(
                    key: _personalDetailFormKey,
                    initialValue:user,               //assigned fetched data
                    autovalidate: true,
                    child: Stack(), 
                ),]));}
      

      【讨论】:

        【解决方案3】:

        苦苦挣扎了好久终于找到form_builder更新问题的解决办法

        class _CommonContentFormState extends State<CommonContentForm>
        var commonForm = GlobalKey<FormBuilderState>();
        
        @override
        Widget build(BuildContext context) {
        // Must create new GlobalKey before building form to update
        // with new data from Provider...
            commonForm = GlobalKey<FormBuilderState>(); 
            formData = Provider.of<FormData>(context); 
            return SingleChildScrollView(
              padding: EdgeInsets.fromLTRB(0,0,20,0),
                child: FormBuilder(
                key: commonForm,
                .....
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-09
          • 2019-05-18
          • 1970-01-01
          • 2019-03-06
          • 2018-04-17
          • 1970-01-01
          相关资源
          最近更新 更多