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