在另一个文件窗口小部件中更新更新值

时间:2020-06-19 13:57:56

标签: flutter dart

我是新手,我尝试从另一个文件中的customWidget更新main.dart中的变量。 我在互联网上搜索,但有点迷茫。

如何使用用户输入的值更新变量userDistance? 我的小部件结构正确吗?还是必须是无状态或有状态的?

Main.dart:

class HomeController extends StatefulWidget {
  HomeController({Key key, this.title}) : super(key: key);
  final String title;

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

class _HomeControllerState extends State<HomeController> {

  // ************************************
  // Variable
  // ************************************
  int userDistance = null;
  final _formKey = GlobalKey<FormState>();

  // ************************************
  // Initialisation
  // ************************************
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: (() => FocusScope.of(context).requestFocus(FocusNode())),
      child: Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: FutureBuilder(
          future: loadJson(),
          builder: (context, snapshot) {
            if (!snapshot.hasData) {
              return CircularProgressIndicator();
            }

            return SingleChildScrollView(
              padding: EdgeInsets.all(24),
              child: Form(
                key: _formKey,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  children: <Widget>[
                    FormValidatorWidgets.buildDistance(), // => Here I call my external widget
...

还有我的customWidget:

import 'package:flutter/material.dart';

class FormValidatorWidgets{

  static buildDistance() {
    return TextFormField(
      decoration: InputDecoration(
        border: OutlineInputBorder(),
        labelText: "Distance",
        hintText: "Enter a distance",
      ),
      keyboardType: TextInputType.number,
      validator: (String value) {
        int distance = int.tryParse(value);

        if (distance == null) {
          return "Distance is required";
        }
        if (distance <= 0) {
          return "Distance must be greater than zero";
        }
      },
      onSaved: (String value) {
        userDistance = int.tryParse(value);
      },
    );
  }

}

如何更新我的变量userDistance?

1 个答案:

答案 0 :(得分:0)

为您的FormValidatorWidgets添加回调函数

class FormValidatorWidgets{

  static buildDistance(FormFieldSetter<String> onSaved) { // onSaved is a callback
    return TextFormField(
      ...
      onSaved: onSaved,
    );
  }
}

然后以您的形式:

  Column(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: <Widget>[
    FormValidatorWidgets.buildDistance(
      (String value) {
        userDistance = int.tryParse(value);
      },
    ),
  ...