【问题标题】:How to store image URL (from Firebase storage) to Firestore [Flutter]如何将图像 URL(从 Firebase 存储)存储到 Firestore [Flutter]
【发布时间】:2021-10-14 18:41:23
【问题描述】:

我是 Flutter 的新手。我目前正在开发我的颤振项目。基本上,我的项目有一个注册页面、登录页面和个人资料页面。用户必须填写一些详细信息,并在注册页面中选择一个临时头像(例如:1、2、3...)。一旦他们单击“注册”按钮,所有详细信息都将保存到 Firestore。用户登录后,选择的头像将显示为用户头像,用户可以稍后更改。

这就是我的注册页面的样子。头像在水平列表视图中,带有数字。用户可以选择头像并在下面的 TextFormField 中输入。此处显示的头像是资产图像。 Register Page

我已将这些头像上传到我的 Firebase 存储Firebase Storage

所以我现在面临的问题是,我不知道如何将 照片 URL 保存到 Firestore。 我希望图像 Firebase 存储 URL 与用户详细信息一起存储在 Firestore 中,而不是存储数字并自己分配 URL。所以以后,用户可以在登录后更改他们的头像。

这是注册页面上的短代码 (将详细信息上传到 Firestore 部分):

  FirebaseAuth _auth = FirebaseAuth.instance;
  FirebaseFirestore _fires = FirebaseFirestore.instance;
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  final idController = TextEditingController();
  final nameController = TextEditingController();
  final emailController = TextEditingController();
  final avatarController = TextEditingController();

  String _studentid, _name, _email, _password, _avatar;

  _register() async {                         // ---> (register button) onPressed: _register,
      if (_formKey.currentState.validate()) {
      _formKey.currentState.save();

      _auth.createUserWithEmailAndPassword(
          email: _email, password: _password).then((currentUser) =>
          _fires.collection("users").doc(_auth.currentUser.uid).set({
        "uid": _auth.currentUser.uid,
        "Name": "$_name",
        "Email": "$_email",
        "Avatar": "$_avatar"  //only store numbers now (avatar 1, 2, 3, ...)
        }).then((result) => {
        //a page that show registration success, then back to login page
          Navigator.pushReplacementNamed(context, "RegisterComplete"), 
            idController.clear(),
            nameController.clear(),
            emailController.clear(),
            avatarController.clear()
        }).catchError((e) => print(e)))
          .catchError((e) => showError(e.message));
    }
  }

(输入头像号码部分的文本框):

Container(
   child: TextFormField(
      validator: (input) {
         if (input.length != 1) return 'Please choose your avatar';
         return null;},
      keyboardType: TextInputType.number,
      inputFormatters: <TextInputFormatter>[
         FilteringTextInputFormatter.allow(RegExp(r'[0-9]')),],
      controller: avatarController,
      decoration: InputDecoration(
         labelText: 'Avatar',
         labelStyle: TextStyle(
         fontSize: 18,
         color: Color(0xFF2C4D83),
      ),
      prefixIcon: Icon(Icons.face, color: Color(0xFF2C4D83),),
   ),
   onSaved: (String value) => _avatar = value),
 ),

我想我必须创建一个条件,如果输入 _avatar = 1,那么 URL 将是“gs://.../avatar1.jpg”,并存储到 Firestore,但我不知道我应该如何写它,代码应该放在哪里。

如果有人可以帮助我或为我提供一些指导,我将不胜感激。谢谢。

【问题讨论】:

    标签: firebase flutter google-cloud-firestore firebase-storage


    【解决方案1】:

    使用该函数获取上传图片的下载地址。然后将它们存储在 Firestore 中的某个位置。您可以在 Firestore 中使用与存储相同的标识符。

     Future <String> _uploadphotofile(mFileImage) async {
                final  Reference storageReference = FirebaseStorage.instance.ref().child("products");
                UploadTask uploadTask = storageReference.child("product_$productId.jpg").putFile(imgfile);
            
                String url = await (await uploadTask).ref.getDownloadURL();
                return url;
              }
    

    【讨论】:

    • 谢谢,我明白你的意思,但是如果我总共有 10 张图片,如果用户在 textFormField 中输入“1”,则意味着用户选择“avatar1.jpg”,如果用户输入“ 2”表示“avatar2.jpg”,用户选择头像后只获取url并存储在firestore中?
    • 你可以选择一个集合,比如说“avatarcollection”。用它的名字存储他们的 url。当用户键入 1 时,您可以从 avatarcollection 调用 avatar1 元素,并且可以从字段中访问其 url。然后将url存储在firestore中用户属性下。
    猜你喜欢
    • 2021-03-14
    • 2019-03-10
    • 2021-02-27
    • 2019-07-24
    • 2021-02-15
    • 2020-03-28
    • 2018-10-24
    • 2019-01-22
    相关资源
    最近更新 更多