Flutter 使用Flatter将屏幕截图上载到Firebase

Flutter 使用Flatter将屏幕截图上载到Firebase,flutter,dart,google-cloud-firestore,Flutter,Dart,Google Cloud Firestore,我想把截图上传到Firestore,但是我有一些空错误 Future uploadImagetoFirebase() async { await screenshotController.capture().then((value) => (File image) { _screenshot = image; }); String fileName = _screenshot.path; Reference firebaseStorageRef = Fireb

我想把截图上传到Firestore,但是我有一些空错误

Future uploadImagetoFirebase() async {
await screenshotController.capture().then((value) => (File image) {
      _screenshot = image;
    });

String fileName = _screenshot.path;
Reference firebaseStorageRef =
    FirebaseStorage.instance.ref().child('orders/$fileName');
UploadTask uploadTask = firebaseStorageRef.putFile(_screenshot);
TaskSnapshot taskSnapshot = await uploadTask;
taskSnapshot.ref.getDownloadURL().then((value) => print('Done: $value'));


}
我用按钮这样称呼它:

 onPressed: () async {
            await uploadImagetoFirebase(); }  
这是错误堆栈:

 flutter ( 5143): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: NoSuchMethodError: The getter 'path' was called on null.
E/flutter ( 5143): Receiver: null
E/flutter ( 5143): Tried calling: path
E/flutter ( 5143): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
E/flutter ( 5143): #1      _CartState.uploadImagetoFirebase
package:CWCFlutter/model/cart.dart:88
E/flutter ( 5143): <asynchronous suspension>
E/flutter ( 5143): #2      _CartState.build.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure>
package:CWCFlutter/model/cart.dart:310
E/flutter ( 5143): #3      _InkResponseState._handleTap
package:flutter/…/material/ink_well.dart:993
E/flutter ( 5143): #4      _InkResponseState.build.<anonymous closure>
package:flutter/…/material/ink_well.dart:1111
E/flutter ( 5143): #5      GestureRecognizer.invokeCallback
package:flutter/…/gestures/recognizer.dart:183
E/flutter ( 5143): #6      TapGestureRecognizer.handleTapUp
package:flutter/…/gestures/tap.dart:598
E/flutter ( 5143): #7      BaseTapGestureRecognizer._checkUp
package:flutter/…/gestures/tap.dart:287
E/flutter ( 5143): #8      BaseTapGestureRecognizer.handlePrimaryPointer
package:flutter/…/gestures/tap.dart:222
E/flutter ( 5143): #9      PrimaryPointerGestureRecognizer.handleEvent
package:flutter/…/gestures/recognizer.dart:476
E/flutter ( 5143): #10     PointerRouter._dispatch
package:flutter/…/gestures/pointer_router.dart:77
E/flutter ( 5143): #11     PointerRouter._dispatchEventToRoutes.<anonymous closure>
package:flutter/…/gestures/pointer_router.dart:122
E/flutter ( 5143): #12     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:377:8)
E/flutter ( 5143): #13     PointerRouter._dispatchEventToRoutes
package:flutter/…/gestures/pointer_router.dart:120
E/flutter ( 5143): #14     PointerRouter.route
package:flutter/…/gestures/pointer_router.dart:106
E/flutter ( 5143): #15     GestureBinding.handleEvent
package:flutter/…/gestures/binding.dart:358
E/flutter ( 5143): #16     GestureBinding.dispatchEvent
package:flutter/…/gestures/binding.dart:338
E/flutter ( 5143): #17     RendererBinding.dispatchEvent
package:flutter/…/rendering/binding.dart:267
E/flutter ( 5143): #18     GestureBinding._handlePointerEvent
package:flutter/…/gestures/binding.dart:295
E/flutter ( 5143): #19     GestureBinding._flushPointerEventQueue
package:flutter/…/gestures/binding.dart:240
E/flutter ( 5143): #20     GestureBinding._handlePointerDataPacket
package:flutter/…/gestures/binding.dart:213
E/flutter ( 5143): #21     _rootRunUnary (dart:async/zone.dart:1206:13)
E/flutter ( 5143): #22     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter ( 5143): #23     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter ( 5143): #24     _invoke1 (dart:ui/hooks.dart:265:10)
E/flutter ( 5143): #25     _dispatchPointerDataPacket (dart:ui/hooks.dart:174:5)
我提出的解决方案似乎很有效

    Future<String> uploadImagetoFirebase2() async {
    File img = await screenshotController.capture();
    setState(() {
      _screenshot = img;
    });
//change filename not to be path, but something else short
    String fileName = img.path;

    Reference firebaseStorageRef =
        FirebaseStorage.instance.ref().child('orders/$fileName');
    UploadTask uploadTask = firebaseStorageRef.putFile(_screenshot);
    TaskSnapshot taskSnapshot = (await uploadTask);
    String uri = await taskSnapshot.ref.getDownloadURL();
    print(uri);
    return uri;
  }
Future uploadImagetoFirebase2()异步{
文件img=await screenshotController.capture();
设置状态(){
_截图=img;
});
//更改文件名不是路径,而是其他简短的内容
字符串文件名=img.path;
参考firebaseStorageRef=
FirebaseStorage.instance.ref().child('orders/$fileName');
UploadTask UploadTask=firebaseStorageRef.putFile(_屏幕截图);
TaskSnapshot TaskSnapshot=(等待上载任务);
字符串uri=await taskSnapshot.ref.getDownloadURL();
打印(uri);
返回uri;
}
Flatter(5143):[ERROR:flatter/lib/ui/ui\u dart\u state.cc(177)]未处理的异常:NoSuchMethodError:对null调用了getter“path”。 E/颤振(5143):接收器:空 E/颤振(5143):尝试呼叫:路径

您的路径为空, 你可以用两种方法来解决这个问题

1。设置状态

Future uploadImagetoFirebase() async {
await screenshotController.capture().then((value) => (File image) {
    setState(() {
              _screenshot = image;
          });     
});
 Future <File> uploadImagetoFirebase() async {
    File myImage=await screenshotController.capture();
    retun myImage
        );
    //get image onPress btn
    
     onPressed: () async {
              var myFile=  await uploadImagetoFirebase();
//check if path is null  using if ...
print(myFile.path);
    // firebase function
Reference firebaseStorageRef =
    FirebaseStorage.instance.ref().child('orders/${myFile.path}');
UploadTask uploadTask = firebaseStorageRef.putFile(myFile);
TaskSnapshot taskSnapshot = (await uploadTask);
String uri = await taskSnapshot.ref.getDownloadURL();
print(uri);
return uri;
     }  
//。。。你的fireabase上传功能

2来自未来的回报

Future uploadImagetoFirebase() async {
await screenshotController.capture().then((value) => (File image) {
    setState(() {
              _screenshot = image;
          });     
});
 Future <File> uploadImagetoFirebase() async {
    File myImage=await screenshotController.capture();
    retun myImage
        );
    //get image onPress btn
    
     onPressed: () async {
              var myFile=  await uploadImagetoFirebase();
//check if path is null  using if ...
print(myFile.path);
    // firebase function
Reference firebaseStorageRef =
    FirebaseStorage.instance.ref().child('orders/${myFile.path}');
UploadTask uploadTask = firebaseStorageRef.putFile(myFile);
TaskSnapshot taskSnapshot = (await uploadTask);
String uri = await taskSnapshot.ref.getDownloadURL();
print(uri);
return uri;
     }  
Future uploadImagetoFirebase()异步{
File myImage=wait screenshotController.capture();
重新生成我的图像
);
//按btn获取图像
onPressed:()异步{
var myFile=等待上传ImageToFirebase();
//使用if。。。
打印(myFile.path);
//火基函数
参考firebaseStorageRef=
FirebaseStorage.instance.ref().child('orders/${myFile.path}');
UploadTask UploadTask=firebaseStorageRef.putFile(myFile);
TaskSnapshot TaskSnapshot=(等待上载任务);
字符串uri=await taskSnapshot.ref.getDownloadURL();
打印(uri);
返回uri;
}  
Flatter(5143):[ERROR:flatter/lib/ui/ui\u dart\u state.cc(177)]未处理的异常:NoSuchMethodError:对null调用了getter“path”。 E/颤振(5143):接收器:空 E/颤振(5143):尝试呼叫:路径

您的路径为空, 你可以用两种方法来解决这个问题

1.设置状态

Future uploadImagetoFirebase() async {
await screenshotController.capture().then((value) => (File image) {
    setState(() {
              _screenshot = image;
          });     
});
 Future <File> uploadImagetoFirebase() async {
    File myImage=await screenshotController.capture();
    retun myImage
        );
    //get image onPress btn
    
     onPressed: () async {
              var myFile=  await uploadImagetoFirebase();
//check if path is null  using if ...
print(myFile.path);
    // firebase function
Reference firebaseStorageRef =
    FirebaseStorage.instance.ref().child('orders/${myFile.path}');
UploadTask uploadTask = firebaseStorageRef.putFile(myFile);
TaskSnapshot taskSnapshot = (await uploadTask);
String uri = await taskSnapshot.ref.getDownloadURL();
print(uri);
return uri;
     }  
//…您的fireabase上载功能

2来自未来的回报

Future uploadImagetoFirebase() async {
await screenshotController.capture().then((value) => (File image) {
    setState(() {
              _screenshot = image;
          });     
});
 Future <File> uploadImagetoFirebase() async {
    File myImage=await screenshotController.capture();
    retun myImage
        );
    //get image onPress btn
    
     onPressed: () async {
              var myFile=  await uploadImagetoFirebase();
//check if path is null  using if ...
print(myFile.path);
    // firebase function
Reference firebaseStorageRef =
    FirebaseStorage.instance.ref().child('orders/${myFile.path}');
UploadTask uploadTask = firebaseStorageRef.putFile(myFile);
TaskSnapshot taskSnapshot = (await uploadTask);
String uri = await taskSnapshot.ref.getDownloadURL();
print(uri);
return uri;
     }  
Future uploadImagetoFirebase()异步{
File myImage=wait screenshotController.capture();
重新生成我的图像
);
//按btn获取图像
onPressed:()异步{
var myFile=等待上传ImageToFirebase();
//使用if。。。
打印(myFile.path);
//火基函数
参考firebaseStorageRef=
FirebaseStorage.instance.ref().child('orders/${myFile.path}');
UploadTask UploadTask=firebaseStorageRef.putFile(myFile);
TaskSnapshot TaskSnapshot=(等待上载任务);
字符串uri=await taskSnapshot.ref.getDownloadURL();
打印(uri);
返回uri;
}  
试试这个

Future<String> uploadImagetoFirebase() async {
File img = await screenshotController.capture();

String fileName = img.path;

Reference firebaseStorageRef =
    FirebaseStorage.instance.ref().child('orders/$fileName');
UploadTask uploadTask = firebaseStorageRef.putFile(_screenshot);
TaskSnapshot taskSnapshot = (await uploadTask);
String uri = await taskSnapshot.ref.getDownloadURL();
print(uri);
return uri;
}
Future uploadImagetoFirebase()异步{
文件img=await screenshotController.capture();
字符串文件名=img.path;
参考firebaseStorageRef=
FirebaseStorage.instance.ref().child('orders/$fileName');
UploadTask UploadTask=firebaseStorageRef.putFile(_屏幕截图);
TaskSnapshot TaskSnapshot=(等待上载任务);
字符串uri=await taskSnapshot.ref.getDownloadURL();
打印(uri);
返回uri;
}
试试这个

Future<String> uploadImagetoFirebase() async {
File img = await screenshotController.capture();

String fileName = img.path;

Reference firebaseStorageRef =
    FirebaseStorage.instance.ref().child('orders/$fileName');
UploadTask uploadTask = firebaseStorageRef.putFile(_screenshot);
TaskSnapshot taskSnapshot = (await uploadTask);
String uri = await taskSnapshot.ref.getDownloadURL();
print(uri);
return uri;
}
Future uploadImagetoFirebase()异步{
文件img=await screenshotController.capture();
字符串文件名=img.path;
参考firebaseStorageRef=
FirebaseStorage.instance.ref().child('orders/$fileName');
UploadTask UploadTask=firebaseStorageRef.putFile(_屏幕截图);
TaskSnapshot TaskSnapshot=(等待上载任务);
字符串uri=await taskSnapshot.ref.getDownloadURL();
打印(uri);
返回uri;
}

我已尝试设置状态,但由于某些原因出现了相同的错误,我将尝试您的第二个修复,但不确定它在我的上下文中如何工作,您是否有可能在第二个示例中添加一些代码?我已更新了我的答案。.尝试打印日志会的,谢谢!使用我的解决方案编辑了主要帖子,谢谢大家。我很高兴我尝试设置状态,但由于某些原因出现了相同的错误,我将尝试您的第二个修复,但不确定它在我的上下文中如何工作,您是否有可能向您的第二个示例中添加一些代码?我已更新了我的答案。尝试打印日志即可,非常感谢!使用我的解决方案编辑了主要帖子。谢谢大家。
wait uplLoadTask.onComplete
这里有一个错误,说onComplete不是为类型
UploadTask定义的,我想这是新的Firebase语法。我今天会试试,谢谢!捕获后我还需要设置状态吗?类似于
设置状态{(\u screenshot=img)}
用我的解决方案编辑了主要帖子,非常感谢。
等待上传任务。onComplete
这里有一个错误,说onComplete没有为类型定义
上传任务
,我想这是新的Firebase语法。我今天就试用,谢谢!捕获后我还需要设置状态吗?类似于
设置状态之类的东西{(_screenshot=img)}
用我的解决方案编辑了主要帖子,非常感谢。