Flutter 如何解决;NoSuchMethodError:方法';FindEnderObject';被调用时为null“;错误?

Flutter 如何解决;NoSuchMethodError:方法';FindEnderObject';被调用时为null“;错误?,flutter,google-cloud-firestore,flutter-layout,qr-code,flutter-dependencies,Flutter,Google Cloud Firestore,Flutter Layout,Qr Code,Flutter Dependencies,我正试图保存一个QR图像并为此添加共享选项,但在这样做的同时,我遇到了这个“FindEnderObject在null上被调用”对象 如何解决此错误?这是下面的代码 生成快速省道 import 'package:attendee/services/database.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; impor

我正试图保存一个QR图像并为此添加共享选项,但在这样做的同时,我遇到了这个“FindEnderObject在null上被调用”对象

如何解决此错误?这是下面的代码

生成快速省道

import 'package:attendee/services/database.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'package:qr_flutter/qr_flutter.dart';
import 'dart:ui';
import 'package:flutter/rendering.dart';
import 'package:intl/intl.dart';
import 'package:attendee/constants.dart';
import 'dart:async';
import 'dart:io';
import 'dart:typed_data';

class GeneratePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => GeneratePageState();
}

class GeneratePageState extends State<GeneratePage> {
  String qrData =
      "https://github.com/neon97"; // already generated qr code when the page opens
  FirebaseAuth auth = FirebaseAuth.instance;
  String subject;

  GlobalKey globalKey = new GlobalKey();

  final CollectionReference student_details =
      FirebaseFirestore.instance.collection('students');
  final CollectionReference tutor_details =
      FirebaseFirestore.instance.collection("tutors");

  String timeString;
  bool _validate = false;
  // String formattedDate = DateFormat('kk:mm:ss \n EEE d MMM').format(now);

  static const double _topSectionTopPadding = 50.0;
  static const double _topSectionBottomPadding = 20.0;
  static const double _topSectionHeight = 50.0;

  void _getTime() {
    final String formattedDateTime =
        DateFormat('yyyy-MM-dd \n kk:mm:ss').format(DateTime.now()).toString();
    //DateFormat('yyyy-MM-dd').toString();
    setState(() {
      timeString = formattedDateTime;
    });
  }

  @override
  void initState() {
    super.initState();
    Timer.periodic(Duration(seconds: 1), (Timer t) => _getTime());
  }

  @override
  Widget build(BuildContext context) {
    var numberOfClasses;
    return Scaffold(
      appBar: AppBar(
        title: Text('QR Code Generator'),
        actions: <Widget>[
          IconButton(
            icon: Icon(Icons.share),
            onPressed: _captureAndSharePng,
          )
        ],
      ),
      body: SingleChildScrollView(
        child: Container(
          padding: EdgeInsets.all(20.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              QrImage(
                //plce where the QR Image will be shown
                data: qrData,
              ),
              SizedBox(
                height: 40.0,
              ),
              Text(
                "New QR Link Generator",
                style: TextStyle(fontSize: 20.0),
              ),
              TextField(
                controller: qrdataFeed,
                decoration: InputDecoration(
                  hintText: "SUBJECT-anything",
                  errorText:
                      _validate ? "Please enter in Sub-Date format!" : null,
                ),
              ),
              Padding(
                  padding: EdgeInsets.fromLTRB(40, 20, 40, 0),
                  child: MaterialButton(
                    minWidth: double.infinity,
                    height: 60,
                    onPressed: () async {
                      qrdataFeed.text
                              .contains(RegExp(r'^[a-zA-Z]*\-[a-zA-Z]*$'))
                          ? _validate = false
                          : _validate = true;
                      if (qrdataFeed.text.isEmpty) {
                        //a little validation for the textfield
                        if (!mounted) return;
                        setState(() {
                          qrData = "";
                        });
                      } else {
                        int index = qrdataFeed.text.indexOf('-');
                        subject = qrdataFeed.text.substring(0, index);
                        print("Subject name is $subject");
                        String user = isTutor ? "tutors" : "students";
                        String uid = FirebaseAuth.instance.currentUser.uid;
                        numberOfClasses = await FirebaseFirestore.instance
                            .collection(user)
                            .doc(uid)
                            .get()
                            .then((value) {
                          return value.data()['numberOfClasses'];
                        });
                        String rollno = await FirebaseFirestore.instance
                            .collection(user)
                            .doc(uid)
                            .get()
                            .then((value) {
                          return value.data()['rollno'];
                        });
                        print('$numberOfClasses is printed pehle');
                        await DatabaseService().attendance(rollno);

                        setState(() {
                          qrData = qrdataFeed.text;
                          scanned = true;
                          print('done');
                          numberOfClasses += 1; //idhar se dekhke
                          print('$numberOfClasses is printed');
                        });
                        await tutor_details.doc(uid).set(
                            {'numberOfClasses': numberOfClasses},
                            SetOptions(merge: true));
                      }
                    },
                    shape: RoundedRectangleBorder(
                        side: BorderSide(
                          color: Colors.black,
                        ),
                        borderRadius: BorderRadius.circular(50)),
                    child: Text(
                      "Generate QR",
                      style:
                          TextStyle(fontWeight: FontWeight.w600, fontSize: 18),
                    ),
                  )),
            ],
          ),
        ),
      ),
    );
  }

  final qrdataFeed = TextEditingController();
  Future<void> _captureAndSharePng() async {
    try {
      RenderRepaintBoundary boundary =
          globalKey.currentContext.findRenderObject();
      print(boundary);
      var image = await boundary.toImage();
      ByteData byteData = await image.toByteData(format: ImageByteFormat.png);
      Uint8List pngBytes = byteData.buffer.asUint8List();

      final tempDir = await getTemporaryDirectory();
      final file = await new File('${tempDir.path}/image.png').create();
      await file.writeAsBytes(pngBytes);

      final channel = const MethodChannel('channel:me.attendee.share/share');
      channel.invokeMethod('shareFile', 'image.png');
    } catch (e) {
      print(e.toString());
    }
  }
}
import'包:attendee/services/database.dart';
导入“包:cloud_firestore/cloud_firestore.dart”;
导入“包:firebase_auth/firebase_auth.dart”;
进口“包装:颤振/材料.省道”;
导入“包:flifter/services.dart”;
导入“package:path_provider/path_provider.dart”;
进口“包装:qr_颤振/qr_颤振.飞镖”;
导入“dart:ui”;
导入“package:flatter/rendering.dart”;
导入“包:intl/intl.dart”;
导入“package:attendee/constants.dart”;
导入“dart:async”;
导入“dart:io”;
导入“dart:键入的_数据”;
类GeneratePage扩展StatefulWidget{
@凌驾
State createState()=>GeneratePageState();
}
类GeneratePageState扩展了状态{
字符串数据=
"https://github.com/neon97“;//页面打开时已生成二维码
FirebaseAuth auth=FirebaseAuth.instance;
字符串主题;
GlobalKey GlobalKey=新的GlobalKey();
最终收集参考学生详细信息=
FirebaseFirestore.instance.collection('students');
最终收藏参考资料=
FirebaseFirestore.instance.collection(“导师”);
字符串时间字符串;
bool _validate=false;
//字符串formattedDate=DateFormat('kk:mm:ss\n EEE d MMM')。格式(现在);
静态常数double _=50.0;
静态常数double _topSectionBottomPadding=20.0;
静态常数双上断面高度=50.0;
void _getTime(){
最终字符串formattedDateTime=
DateFormat('yyyy-MM-dd\n kk:MM:ss').format(DateTime.now()).toString();
//DateFormat('yyyy-MM-dd')。toString();
设置状态(){
timeString=formattedDateTime;
});
}
@凌驾
void initState(){
super.initState();
Timer.periodic(持续时间(秒:1),(Timer t)=>\u getTime());
}
@凌驾
小部件构建(构建上下文){
var数类;
返回脚手架(
appBar:appBar(
标题:文本(“二维码生成器”),
行动:[
图标按钮(
图标:图标(Icons.share),
按下按钮:\ U captureAndSharePng,
)
],
),
正文:SingleChildScrollView(
子:容器(
填充:所有边缘设置(20.0),
子:列(
crossAxisAlignment:crossAxisAlignment.stretch,
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
QrImage(
//将显示QR图像的plce
数据:qrData,
),
大小盒子(
身高:40.0,
),
正文(
“新的QR链接生成器”,
样式:TextStyle(fontSize:20.0),
),
文本字段(
控制器:qrdataFeed,
装饰:输入装饰(
hintText:“任何主题”,
错误文本:
_验证?“请以子日期格式输入!”:空,
),
),
填充物(
填充:从LTRB(40,20,40,0)开始的边缘设置,
子:材质按钮(
minWidth:double.infinity,
身高:60,
onPressed:()异步{
qrdataFeed.text
.contains(RegExp(r'^[a-zA-Z]*\-[a-zA-Z]*$))
?_validate=false
:_validate=true;
if(qrdataFeed.text.isEmpty){
//对textfield进行一点验证
如果(!已安装)返回;
设置状态(){
qrData=“”;
});
}否则{
int index=qrdataFeed.text.indexOf('-');
subject=qrdataFeed.text.substring(0,索引);
打印(“主题名称为$Subject”);
字符串user=isTutor?“导师”:“学生”;
字符串uid=FirebaseAuth.instance.currentUser.uid;
numberOfClasses=等待FirebaseFirestore.instance
.收集(用户)
.doc(uid)
.get()
.然后((值){
返回值.data()['numberOfClasses'];
});
String rollno=wait FirebaseFirestore.instance
.收集(用户)
.doc(uid)
.get()
.然后((值){
返回值.data()['rollno'];
});
打印(“$numberOfClasses打印为pehle”);
等待DatabaseService().出勤(rollno);
设置状态(){
qrData=qrdataFeed.text;
扫描=真;
打印(“完成”);
numberOfClasses+=1;//idhar se dekhke
打印(“$numberOfClasses已打印”);
});
等待详细信息。文档(uid)。设置(
{'numberOfClasses':numberOfClasses},
SetOptions(合并:true));
}
},
形状:圆形矩形边框(
边线(
颜色:颜色,黑色,
),
边界半径:边界半径。圆形(50)),
RenderRepaintBoundary boundary = globalKey.currentContext.findRenderObject();