Android 有人能帮我执行这个post按钮吗?

Android 有人能帮我执行这个post按钮吗?,android,ios,android-studio,flutter,dart,Android,Ios,Android Studio,Flutter,Dart,我希望你们今天都做得很好。我还有另外一个问题,过去几天我一直在讨论这个问题。我正在尝试将此数据上载到firestore实例,但我的“发布”按钮似乎从未触发。我试图打印它所引发的方法中的语句,但我似乎也无法让它工作。我正在尝试创建一个社交媒体应用程序,任何和所有的帮助都将不胜感激 我的主要目标是在upload.dart中执行post按钮。 我还包括home.dart,因为这两个类在性能方面是相互关联的 上传.dart import 'dart:io'; import 'package:cach

我希望你们今天都做得很好。我还有另外一个问题,过去几天我一直在讨论这个问题。我正在尝试将此数据上载到firestore实例,但我的“发布”按钮似乎从未触发。我试图打印它所引发的方法中的语句,但我似乎也无法让它工作。我正在尝试创建一个社交媒体应用程序,任何和所有的帮助都将不胜感激

我的主要目标是在upload.dart中执行post按钮。

我还包括home.dart,因为这两个类在性能方面是相互关联的

上传.dart

import 'dart:io';

import 'package:cached_network_image/cached_network_image.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:fluttermedia/models/user.dart';
import 'package:fluttermedia/pages/home.dart';
import 'package:fluttermedia/widgets/progress.dart';
import 'package:image_picker/image_picker.dart';
import 'package:path_provider/path_provider.dart';
import 'package:image/image.dart' as Im;
import 'package:uuid/uuid.dart';

class Upload extends StatefulWidget {
  final User currentUser;

  Upload({this.currentUser});

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

class _UploadState extends State<Upload> {
  TextEditingController locationController = TextEditingController();
  TextEditingController captionController = TextEditingController();
  File file;
  bool isUploading = false;
  String postId = Uuid().v4();

  handleChooseFromGallery() async{
    Navigator.pop(context);
    File file = await ImagePicker.pickImage(source: ImageSource.gallery);
    setState(() {
      this.file = file;
    });
  }

  handleTakePhoto() async {
    Navigator.pop(context);
    File file = await ImagePicker.pickImage(source: ImageSource.camera,maxHeight: 675,maxWidth: 960);
    setState(() {
      this.file = file;
    });
  }

  selectImage(parentContext){
    return showDialog(
        context: parentContext,
      builder: (context) {
          return SimpleDialog(
            title: Text("Create Post"),
            children: <Widget>[
              SimpleDialogOption(
                child: Text("Photo With Camera"),
                onPressed: handleTakePhoto,
              ),
              SimpleDialogOption(
                child: Text("Image from Gallery"),
                onPressed: handleChooseFromGallery,
              ),
              SimpleDialogOption(
                child: Text("Cancel"),
                onPressed: () => Navigator.pop(context),
              ),
            ],
          );
      }
    );
  }

  Container buildSplashScreen(){
    return Container(
      color: Theme.of(context).accentColor.withOpacity(0.6),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          SvgPicture.asset('assets/images/upload.svg',height: 260.0,),
          Padding(
            padding: EdgeInsets.only(top:20.0),
            child: RaisedButton(
              shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.circular(8.0),
              ),
              child: Text(
                "Upload Image",
                style: TextStyle(
                color: Colors.white,
                fontSize: 22.0,
                ),
              ),
              color: Colors.deepOrange,
              onPressed: () => selectImage(context),
            ),
          )
        ],
      ),

    );
  }

  clearImage(){
    setState(() {
      file = null;
    });
  }

  //This compresses images for firebase
  compressImage() async{
    final tempDir = await getTemporaryDirectory();
    final path = tempDir.path;
    Im.Image imageFile = Im.decodeImage(file.readAsBytesSync());
    final compressedImageFile = File('$path/img_$postId.jpg')..writeAsBytesSync(Im.encodeJpg(imageFile,quality: 85));
    setState(() {
      file = compressedImageFile;
    });
  }

  Future<String> uploadImage(imageFile) async{
    StorageUploadTask uploadTask = storageRef.child("post_$postId.jpg").putFile(imageFile);
    StorageTaskSnapshot storageSnap = await uploadTask.onComplete;
    String downloadUrl = await storageSnap.ref.getDownloadURL();
    return downloadUrl;
  }

  //upload new info to firestore that creates a new collection
  createPostInFirestore({String mediaUrl, String location, String description}){
    postsRef.document(widget.currentUser.id)
        .collection("userPosts")
        .document(postId)
        .setData({
      "postId": postId,
      "ownerId": widget.currentUser.id,
      "username": widget.currentUser.username,
      "mediaUrl": mediaUrl,
      "description": description,
      "location": location,
      "timestamp": timeStamp,
      "likes":{}
        });
  }

  //Getting the info from the caption, location and pic
  handleSubmit() async{
    setState(() {
      isUploading = true;
    });
    await compressImage();
    String mediaUrl = await uploadImage(file);
    createPostInFirestore(
      mediaUrl: mediaUrl,
      location: locationController.text,
      description: captionController.text,
    );
    captionController.clear();
    locationController.clear();
    setState(() {
      file = null;
      isUploading = false;
    });
  }

  Scaffold buildUploadForm(){
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white70,
        leading: IconButton(
          icon: Icon(Icons.arrow_back,color: Colors.black,),
          onPressed: clearImage,
        ),
        title: Text(
          "Caption Post",
          style: TextStyle(color: Colors.black),
        ),
        actions: <Widget>[
          FlatButton(
            onPressed: () => isUploading ? null : () => handleSubmit(),
            child: Text(
                "Post",
              style: TextStyle(
                color: Colors.blueAccent,
                fontWeight: FontWeight.bold,
                fontSize: 20.0,
              ),
            ),
          )
        ],
      ),
      body: ListView(
        children: <Widget>[
          isUploading ? linearProgress(context):Text(""),
          Container(
            height: 220.0,
            width: MediaQuery.of(context).size.width*0.8,
            child: Center(
              child: AspectRatio(
                aspectRatio: 16/9,
                child: Container(
                  decoration: BoxDecoration(
                    image: DecorationImage(
                      fit: BoxFit.cover,
                      image: FileImage(file),
                    )
                  ),
                ),
              ),
            ),
          ),
          Padding(
            padding: EdgeInsets.only(top:10),
          ),
          ListTile(
            leading: CircleAvatar(
              backgroundImage: CachedNetworkImageProvider(widget.currentUser.photoUrl),
            ),
            title: Container(
              width: 250.0,
              child: TextField(
                controller: captionController,
                decoration: InputDecoration(
                  hintText: "Write a Caption...",
                  border: InputBorder.none,
                ),
              ),
            ),
          ),
          Divider(),
          ListTile(
            leading: Icon(Icons.pin_drop,color: Colors.orange,size: 35.0),
            title: Container(
              width: 250.0,
              child: TextField(
                controller: locationController,
                decoration: InputDecoration(
                  hintText: "Where was this photo taken",
                  border: InputBorder.none,
                ),
              ),
            ),
          ),
          Container(
            width: 200.0,
            height: 100.0,
            alignment: Alignment.center,
            child: RaisedButton.icon(
              label: Text(
                "Use Current Location",
                style: TextStyle(color: Colors.white),
              ),
              shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(30.0),
              ),
              color: Colors.blue,
              onPressed: () => print("Get user location"),
              icon: Icon(
                Icons.my_location,
                color: Colors.white,
              ),
            ),
          )
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return file == null ? buildSplashScreen() : buildUploadForm();
  }
}


导入'dart:io';
导入“package:cached_network_image/cached_network_image.dart”;
导入“包:firebase_存储/firebase_存储.dart”;
进口“包装:颤振/材料.省道”;
导入“package:flatter_svg/flatter_svg.dart”;
导入“包:flattermedia/models/user.dart”;
导入“包:flattermedia/pages/home.dart”;
导入“package:flattermedia/widgets/progress.dart”;
导入“包:image_picker/image_picker.dart”;
导入“package:path_provider/path_provider.dart”;
将“package:image/image.dart”作为Im导入;
导入“包:uuid/uuid.dart”;
类上载扩展了StatefulWidget{
最终用户当前用户;
上载({this.currentUser});
@凌驾
_UploadState createState();
}
类_UploadState扩展状态{
TextEditingController位置控制器=TextEditingController();
TextEditingController标题控制器=TextEditingController();
文件;
bool=false;
字符串postId=Uuid().v4();
handleChooseFromGallery()异步{
Navigator.pop(上下文);
File File=wait ImagePicker.pickImage(来源:ImageSource.gallery);
设置状态(){
this.file=文件;
});
}
handleTakePhoto()异步{
Navigator.pop(上下文);
File File=wait ImagePicker.pickImage(来源:ImageSource.camera,最大高度:675,最大宽度:960);
设置状态(){
this.file=文件;
});
}
选择图像(父上下文){
返回显示对话框(
上下文:parentContext,
生成器:(上下文){
返回SimpleDialog(
标题:文本(“创建帖子”),
儿童:[
简单幻觉(
孩子:文本(“带照相机的照片”),
onPressed:handleTakePhoto,
),
简单幻觉(
子项:文本(“图库中的图像”),
onPressed:handleChooseFromGallery,
),
简单幻觉(
子项:文本(“取消”),
onPressed:()=>Navigator.pop(上下文),
),
],
);
}
);
}
容器屏幕(){
返回容器(
颜色:主题.of(上下文).accentColor.withOpacity(0.6),
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
SvgPicture.asset('assets/images/upload.svg',高度:260.0,),
填充物(
填充:仅限边缘设置(顶部:20.0),
孩子:升起按钮(
形状:圆形矩形边框(
边界半径:边界半径。圆形(8.0),
),
子:文本(
“上传图像”,
样式:TextStyle(
颜色:颜色,白色,
字体大小:22.0,
),
),
颜色:颜色。深橙色,
按下时:()=>选择图像(上下文),
),
)
],
),
);
}
clearImage(){
设置状态(){
file=null;
});
}
//这将压缩firebase的图像
压缩映像()异步{
final tempDir=await getTemporaryDirectory();
最终路径=tempDir.path;
Im.Image imageFile=Im.decodeImage(file.readAsBytesSync());
final compressedImageFile=File('$path/img_$postId.jpg')…writeAsBytesSync(Im.encodeJpg(imageFile,质量:85));
设置状态(){
file=压缩dimagefile;
});
}
未来上载映像(图像文件)异步{
StorageUploadTask uploadTask=storageRef.child(“post_$postId.jpg”).putFile(imageFile);
StorageTaskSnapshot storageSnap=等待上载Task.onComplete;
String downloadUrl=await-storageSnap.ref.getDownloadURL();
返回下载URL;
}
//将新信息上载到创建新集合的firestore
CreatePostInfirRestore({String mediaUrl,String location,String description}){
postsRef.document(widget.currentUser.id)
.collection(“用户帖子”)
.文件(已过帐)
.setData({
“posted”:posted,
“ownerId”:widget.currentUser.id,
“用户名”:widget.currentUser.username,
“mediaUrl”:mediaUrl,
“描述”:描述,
“位置”:位置,
“时间戳”:时间戳,
“喜欢”:{}
});
}
//从标题、位置和图片中获取信息
handleSubmit()异步{
设置状态(){
IsUpload=true;
});
等待压缩图像();
字符串mediaUrl=等待上载映像(文件);
CreatePostInfiniteRestore(
mediaUrl:mediaUrl,
位置:locationController.text,
描述:captionController.text,
);
captionController.clear();
locationController.clear();
设置状态(){
file=null;
isUploading=false;
});
}
Scaffold buildUploadForm(){
返回脚手架(
appBar:appBar(
背景颜色:Colors.white70,
领先:IconButton(
图标:图标(图标。箭头返回,颜色:颜色。黑色,),
按:clearImage,
),
标题:正文(
“标题帖子”,
样式:TextStyle(颜色:Colors.black),
),
行动:[
扁平按钮(
onPressed:()=>IsUpload?null:()=>handleSubmit(),
子:文本(
“职位”,
样式:TextStyle(
颜色:Colors.blueAccent,

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fluttermedia/models/user.dart';
import 'package:fluttermedia/pages/activity_feed.dart';
import 'package:fluttermedia/pages/create_account.dart';
import 'package:fluttermedia/pages/profile.dart';
import 'package:fluttermedia/pages/search.dart';
import 'package:fluttermedia/pages/upload.dart';
import 'package:google_sign_in/google_sign_in.dart';

final GoogleSignIn googleSignIn = GoogleSignIn();
final StorageReference storageRef = FirebaseStorage.instance.ref();
final usersRef = Firestore.instance.collection('users');
final postsRef = Firestore.instance.collection('posts');
final DateTime timeStamp = DateTime.now();
User currentUser;

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {

  bool isAuth = false;
  PageController pageController;
  int pageIndex = 0;

  @override
  void initState() {
    super.initState();
    pageController = PageController();
    // Detects if user signs in
    googleSignIn.onCurrentUserChanged.listen((account) {
      handleSignIn(account);
    }, onError: (err){
      print('Error sigining in: $err');
    });
    //Reauthenticate user when app is opened
    googleSignIn.signInSilently(suppressErrors: false)
    .then((account) =>
        handleSignIn(account)).catchError((err){
          print('Error signing in on retry: $err');
    });

  }

  @override
  Widget build(BuildContext context) {
    return isAuth ? buildAuthScreen() : buildUnAuthScreen();
  }

  @override
  void dispose(){
    pageController.dispose();
    super.dispose();
  }

  //Helper Functions
  //The sign in section of the code
  handleSignIn(GoogleSignInAccount account){
      if(account != null){
        createUserInFirestore();
        setState(() {
          isAuth = true;
        });
      }else{
        setState(() {
          isAuth = false;
        });
      }
  }

  login(){
    googleSignIn.signIn();
  }

  logout(){
    googleSignIn.signOut();
  }

  onPageChanged(int pageIndex){
    setState(() {
      this.pageIndex =  pageIndex;
    });
  }

  createUserInFirestore() async{
    // 1) Check if user exists in users collection in database (According to id)
    final GoogleSignInAccount user = googleSignIn.currentUser;
    DocumentSnapshot doc = await usersRef.document(user.id).get();
    if(!doc.exists){
      // 2) If the user doesn't exist, take them to create account page
      final username = await Navigator.push(context, MaterialPageRoute(builder: (context) => CreateAccount()));
      // 3) get username from create account, use it to make new user document in users collection
      usersRef.document(user.id).setData({
        "id":user.id,
        "username":username,
        "photoUrl": user.photoUrl,
        "email":user.email,
        "displayName": user.displayName,
        "bio":"",
        "timeStamp": timeStamp,
      });
      doc = await usersRef.document(user.id).get();
    }
    currentUser = User.fromDocument(doc);
    //print(currentUser);
    //print(currentUser.username);
  }

  onTap(int pageIndex){
    //This what you would use to animate in between the different screens
    pageController.animateToPage(
        pageIndex,
        duration: Duration(milliseconds: 300),
        curve: Curves.easeInOut
    );
  }

//UI Code
  Widget buildAuthScreen() {
    return Scaffold(
      body: PageView(
        children: <Widget>[
          //Timeline(),
          RaisedButton(
            child: Text('Logout'),
            onPressed: logout,
          ),
          ActivityFeed(),
          Upload(currentUser: currentUser),
          Search(),
          Profile(),
        ],
        controller: pageController,
        onPageChanged: onPageChanged,
        physics: NeverScrollableScrollPhysics(),
      ),
      bottomNavigationBar: CupertinoTabBar(
        currentIndex: pageIndex,
        onTap: onTap,
        activeColor: Theme.of(context).primaryColor,
        items: [
          BottomNavigationBarItem(icon: Icon(Icons.whatshot),),
          BottomNavigationBarItem(icon: Icon(Icons.notifications_active),),
          BottomNavigationBarItem(icon: Icon(Icons.photo_camera, size: 34.0,),),
          BottomNavigationBarItem(icon: Icon(Icons.search),),
          BottomNavigationBarItem(icon: Icon(Icons.account_circle),),
        ],
      ),
    );

    /*return RaisedButton(
      child: Text('Logout'),
      onPressed: logout,
    );*/
  }

  Scaffold buildUnAuthScreen() {
    return Scaffold(
      body: Container(
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.height,
        decoration: BoxDecoration(
          gradient: LinearGradient(
            begin: Alignment.topRight,
            end: Alignment.bottomLeft,
            colors: [
              Theme.of(context).primaryColor,
              Theme.of(context).accentColor,
            ]
          )
        ),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Text('FlutterMedia',
            style: TextStyle(
              fontFamily: "Signatra",
              fontSize: 90.0,
              color: Colors.white
            ),
            ),
            GestureDetector(
              onTap:() => login(),
              child: Container(
                width: 260,
                height: 60,
                decoration: BoxDecoration(
                  image: DecorationImage(
                    image: AssetImage('assets/images/google_signin_button.png'),
                    fit: BoxFit.cover,
                  ),
                ),
              ),
            )
          ],
        ),
      ),
    );
  }


}