如何在flutter中从initState()块中获取变量的值?

时间:2020-09-13 07:54:54

标签: flutter dart

我已经使用widget.storage.readCounter()函数将值存储在initState()的Documents目录中。我想获取该值并存储在TextEditingController中作为初始值。但是我无法从initState()块中获取值。如何从initState()块中获取值?这是我的完整代码:

   class _UserForm extends State<UserForm> {
  TextEditingController uid;
  static String userid;
  @override
  void initState() {
    super.initState();
    widget.storage.readCounter().then((int value) {
      userid = value.toString();
      /*setState(() => {
            userid = value.toString(),
          });*/
    });
    uid = TextEditingController(text: userid);
  }

   final _formKey = GlobalKey<FormState>();
  //TextEditingController uid = TextEditingController(text: userid);
  final TextEditingController myController = TextEditingController();
  final TextEditingController myController2 = TextEditingController();
  final TextEditingController myController3 = TextEditingController();
  final TextEditingController myController4 = TextEditingController();
  final TextEditingController myController5 = TextEditingController();
  final TextEditingController myController6 = TextEditingController();

  @override
  void dispose() {
    // Clean up the controller when the widget is disposed.
    uid.dispose();
    myController.dispose();
    myController2.dispose();
    myController3.dispose();
    myController4.dispose();
    myController5.dispose();
    myController6.dispose();
    super.dispose();
  }

  Future<SubmitData> _futureSubmitData;
  @override
  Widget build(BuildContext context) {
    showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          content: Text('uid:' + uid.text),
        );
      },
    );
    return Form(
        key: _formKey,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Column(
              children: <Widget>[
                /*Visibility(
                  visible: false,
                  child: TextFormField(
                    controller: uid,
                  ),
                ),*/
                TextFormField(
                  controller: myController,
                  keyboardType: TextInputType.numberWithOptions(decimal: true),
                  decoration:
                      InputDecoration(hintText: 'Sale amount as per party'),
                  validator: (value) {
                    if (value.isEmpty) {
                      return 'Please enter amount.';
                    }
                    return null;
                  },
                ),
                TextFormField(
                  controller: myController2,
                  keyboardType: TextInputType.number,
                  decoration: InputDecoration(hintText: 'Item quantity'),
                  validator: (value) {
                    if (value.isEmpty) {
                      return 'Please enter quantity.';
                    }
                    return null;
                  },
                ),
                TextFormField(
                  controller: myController3,
                  keyboardType: TextInputType.numberWithOptions(decimal: true),
                  decoration: InputDecoration(hintText: 'Rate'),
                  validator: (value) {
                    if (value.isEmpty) {
                      return 'Please enter rate.';
                    }
                    return null;
                  },
                ),
                TextFormField(
                  controller: myController4,
                  decoration: InputDecoration(hintText: 'Broker name'),
                  validator: (value) {
                    if (value.isEmpty) {
                      return 'Please enter broker name.';
                    }
                    return null;
                  },
                ),
                TextFormField(
                  controller: myController5,
                  decoration: InputDecoration(hintText: 'Party name'),
                  validator: (value) {
                    if (value.isEmpty) {
                      return 'Please enter party name.';
                    }
                    return null;
                  },
                ),
                TextFormField(
                  controller: myController6,
                  keyboardType: TextInputType.numberWithOptions(decimal: true),
                  decoration: InputDecoration(
                      hintText: 'Amount receivable as per party'),
                  validator: (value) {
                    if (value.isEmpty) {
                      return 'Please enter amount.';
                    }
                    return null;
                  },
                ),
                Container(
                  margin: EdgeInsets.only(top: 10),
                  child: RaisedButton(
                    color: Colors.purple[400],
                    padding: EdgeInsets.only(
                        left: 110, top: 10, right: 110, bottom: 10),
                    textColor: Colors.white,
                    onPressed: () {
                      if (_formKey.currentState.validate()) {
                        setState(() {
                          showDialog(
                            context: context,
                            builder: (context) {
                              return AlertDialog(
                                content: Text('uid:' + uid.text),
                              );
                            },
                          );
                          /*_futureSubmitData = userData(
                              uid.text,
                              myController.text,
                              myController2.text,
                              myController3.text,
                              myController4.text,
                              myController5.text,
                              myController6.text);*/
                        });
                        Scaffold.of(context).removeCurrentSnackBar();
                      }
                    },
                    child: Text('Submit', style: TextStyle(fontSize: 18.0)),
                  ),
                ),
              ],
            ),
            (_futureSubmitData != null)
                ? FutureBuilder<SubmitData>(
                    future: _futureSubmitData,
                    builder: (context, snapshot) {
                      if (snapshot.hasData) {
                        if (snapshot.data.type == '1') {
                          /*showDialog(
                            context: context,
                            builder: (context) {
                              return AlertDialog(
                                content: Text('Data submitted successfully.'),
                              );
                            },
                          );*/
                          Scaffold.of(context)
                            ..removeCurrentSnackBar()
                            ..showSnackBar(SnackBar(
                                content: Text('Data submitted successfully.',
                                    style:
                                        TextStyle(color: Colors.green[100]))));
                          return Text('');
                        } else {
                          Scaffold.of(context)
                            ..removeCurrentSnackBar()
                            ..showSnackBar(SnackBar(
                                content: Text(
                                    'Data not submitted. You have already submitted for today.',
                                    style: TextStyle(color: Colors.red[100]))));
                          return Text('');
                        }
                      } else if (snapshot.hasError) {
                        return Text("${snapshot.error}");
                      }
                      return Center(child: CircularProgressIndicator());
                    },
                  )
                : Text(''),
          ],
        ));
  }
}

但是我在initState()中得到了userid的值。但是,当我在initState()块之后的 Widget build(BuildContext context)中的showDialog()中打印值时,它给出了空白值。我的问题是如何在 Widget build(BuildContext context)块中获取uid的值?

2 个答案:

答案 0 :(得分:0)

我可能是错的( 编辑: 我错了。),但是我相信您的问题是“技术上”您没有分配变量的值 inside initState方法,但在回调中。

您可以做的是这样重写回调:

     @override
     void initState() {
     super.initState();
      widget.storage.readCounter().then((int value) {
         setState( () => {
           userid = value.toString();
         });
       });
     }
    

答案 1 :(得分:0)

首先在状态类的initState之外初始化TextController和userid变量

    TextEditingController uid; 
    String userid;

         @override
         void initState() {
         super.initState();
          widget.storage.readCounter().then((int value) {
             userid = value.toString();
             uid = TextEditingController(text: userid);
           });
           print(userid); // This is to make sure you're actually getting a value back. Check your console.
         }

您现在应该可以通过TextEditingController访问“ userid”的值了。