Flutter:通过构造函数传递数据

时间:2019-09-22 18:29:00

标签: flutter dart flutter-layout

我目前正在学习,我不知道为什么我不能通过构造函数传递这些数据。

主屏幕:

    TitleTextField(
                      textFieldOnSaved: textFieldFinalValue,
                      hintText: "Add title here",
                    ),

     createLocationPostInFirestore(
          {String mediaUrl,
          String description,
          double heightRestriction,
          double widthRestriction}) {
        locationPostRef
            .document(currentUser.id)
            .collection("user_location_posts")
            .document(postId)
            .setData({
          "postId": postId,
          "ownerId": currentUser.id,
          "username": currentUser.username,
]
          "test_title": textFieldFinalValue,
        });
      }

      handlePostSubmit() async {
        setState(() {
          isUploading = true;
        });
        await compressStoryImage();
        String mediaUrl = await uploadStoryImage(locationImageFile);
        createLocationPostInFirestore(
          mediaUrl: mediaUrl,
          heightRestriction: heightRestrictionValue,
        );
        SnackBar snackbar = SnackBar(
          content: Text("Location Uploaded"),
        );
        _addNewLocationScreenScaffoldKey.currentState.showSnackBar(snackbar);
        setState(() {
          isUploading = false;
          postId = Uuid().v4();
        });
      }

这是小部件:

import 'package:flutter/material.dart';

class TitleTextField extends StatefulWidget {
  final TextEditingController handleTextEditingController;
  final String textFieldOnSaved;
  final String hintText;
  TitleTextField(
      {this.handleTextEditingController, this.textFieldOnSaved, this.hintText});

  void _getTextfield(String textFieldOnSaved) {
    textFieldOnSaved = textFieldOnSaved;
  }

  _TitleTextFieldState createState() => _TitleTextFieldState();
}

class _TitleTextFieldState extends State<TitleTextField> {
  final TextEditingController handleTextEditingController =
      TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Container(
      child: TextField(
        decoration: new InputDecoration.collapsed(
          hintText: widget.hintText,
        ),
        controller: handleTextEditingController,
        onChanged: (String textFieldValue) {
          setState(() {
            widget._getTextfield(textFieldValue);
          });
        },
      ),
    );
  }
}

我想做的是从文本字段中获取值,并将其传递回构造函数,然后返回主屏幕,以便随后将值保存到Firestore。

我要去哪里错了?

1 个答案:

答案 0 :(得分:1)

我是初学者,但也许我可以为您提供帮助。 我为此安装了软件包共享首选项。 我也在我的应用程序中使用过它。

包裹在这里:https://pub.dev/packages/shared_preferences#-installing-tab-

我有一个文件:Formula.dart,其中包含我需要的所有公式和变量。在这里,我已经导入:

import 'package:shared_preferences/shared_preferences.dart';
import 'dart:math';

我也有这个变量:

bool weight = true;
int mixingRatio = 50;
int liquidGravity = 105;

然后我有一种存储值的方法,用户输入:

updateValues() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setInt('mixingRatio', mixingRatio);
  prefs.setInt('liquidGravity', liquidGravity);
  prefs.setBool('weight', weight);
}

您也可以加载此值,我仅在加载的第一页上具有此值。看来它已经存在了,您必须将其直接放在类下:

  @override
  void initState() {
    super.initState();
    loadValues();
  }

loadValues() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  mixingRatio = (prefs.getInt('mixingRatio') ?? 50);
  liquidGravity = (prefs.getInt('liquidGravity') ?? 105);
  weight = (prefs.getBool('weight') ?? true);
}

您会看到,它拾取了存储的值。如果没有值,则将其放在??之后给出的值中。

祝你好运!