Flutter错误:由于可能为空,因此无法在“WidgetsBinding?”上调用“addPostFrameCallback”方法

12

每当我尝试运行Flutter应用时,都会出现这个错误。

../flutter/.pub-cache/hosted/pub.dartlang.org/percent_indicator-4.2.1/lib/linear_percent_indicator.dart:162:5: Warning: The class 'WidgetsBinding' cannot be null.
Try replacing '?.' with '.'
    WidgetsBinding?.instance.addPostFrameCallback((_) {
    ^^^^^^^^^^^^^^
../flutter/.pub-cache/hosted/pub.dartlang.org/percent_indicator-4.2.1/lib/linear_percent_indicator.dart:162:30: Error: Method 'addPostFrameCallback' cannot be called on 'WidgetsBinding?' because it is potentially null.
 - 'WidgetsBinding' is from 'package:flutter/src/widgets/binding.dart' ('../flutter/packages/flutter/lib/src/widgets/binding.dart').
Try calling using ?. instead.
    WidgetsBinding?.instance.addPostFrameCallback((_) {
                             ^^^^^^^^^^^^^^^^^^^^


FAILURE: Build failed with an exception.

* Where:
Script '/home/user/Downloads/flutter/packages/flutter_tools/gradle/flutter.gradle' line: 1102

* What went wrong:
Execution failed for task ':app:compileFlutterBuildDebug'.
> Process 'command '/home/user/Downloads/flutter/bin/flutter'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 22s
Running Gradle task 'assembleDebug'...                             22.8s
Exception: Gradle task assembleDebug failed with exit code 1

以下是我的Flutter doctor输出:

[✓] Flutter (Channel stable, 2.10.3, on Ubuntu 20.04.4 LTS 5.13.0-41-generic, locale en_IN)
    • Flutter version 2.10.3 at /home/user/Downloads/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 7e9793dee1 (3 months ago), 2022-03-02 11:23:12 -0600
    • Engine revision bd539267b4
    • Dart version 2.16.1
    • DevTools version 2.9.2

[✓] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1)
    • Android SDK at /home/user/Android/Sdk
    • Platform android-32, build-tools 32.1.0-rc1
    • Java binary at: /opt/android-studio-2021.1.1/android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 11.0.11+0-b60-7590822)
    • All Android licenses accepted.

[✓] Chrome - develop for the web
    • Chrome at google-chrome

[✓] Android Studio (version 2021.1)
    • Android Studio at /opt/android-studio-2021.1.1/android-studio
    • Flutter plugin version 66.0.1
    • Dart plugin version 211.7811
    • Java version OpenJDK Runtime Environment (build 11.0.11+0-b60-7590822)

[✓] Android Studio
    • Android Studio at /opt/android-studio
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 11.0.11+0-b60-7590822)

[✓] Connected device (2 available)
    • sdk gphone64 x86 64 (mobile) • emulator-5554 • android-x64    • Android 12 (API 31) (emulator)
    • Chrome (web)                 • chrome        • web-javascript • Google Chrome 99.0.4844.82

[✓] HTTP Host Availability
    • All required HTTP hosts are available

• No issues found!

我已经尝试了以下方法:

  1. 使android-studio无效并重新启动
  2. 删除.gradle文件夹并尝试再次构建
  3. flutter clean后执行flutter pub getflutter pub cache repair
    • 同时删除了build文件夹和pubspec.lock文件

但是没有起作用。

另外,这是我的Gradle文件:

android/app/build.gradle

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
apply plugin: 'com.google.gms.google-services'
android {
    compileSdkVersion flutter.compileSdkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }
    splits {
        abi {
            enable true
            reset()
            include 'x86', 'armeabi-v7a'
            universalApk true
        }
    }
    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.example.app.example"
        minSdkVersion 19
        targetSdkVersion flutter.targetSdkVersion
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        multiDexEnabled = true
    }
    // signingConfigs {
    //     debug {
    //         if (debugKeystorePropertiesFile.exists()) {
    //             keyAlias debugKeystoreProperties['keyAlias']
    //             keyPassword debugKeystoreProperties['keyPassword']
    //             storeFile file(debugKeystoreProperties['storeFile'])
    //             storePassword debugKeystoreProperties['storePassword']
    //         }
    //     }
    // }
    buildTypes {
        release {
//            if (keystorePropertiesFile.exists()) {
//                signingConfig signingConfigs.release
//                println "Signing with key.properties"
//            } else {
                signingConfig signingConfigs.debug
                println "Signing with debug keys"
//            }
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation platform('com.google.firebase:firebase-bom:29.2.1')
    implementation 'com.google.firebase:firebase-auth-ktx'
    implementation 'com.google.android.gms:play-services-safetynet:18.0.1'
    implementation 'com.google.firebase:firebase-appcheck-safetynet:16.0.0-beta05'

    implementation "androidx.browser:browser:1.3.0"
}

Android/build.gradle

buildscript {
    ext.kotlin_version = '1.6.10'
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.google.gms:google-services:4.3.10'
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

  • 我确实将android.useAndroidXandroid.enableJetifier设置为true。
  • 同时在androidmanifest.xml中添加了android:exported="true"

这个问题是由percent_indicator: ^4.0.0引起的。我注释了这个库的使用,并从pubspec中删除了它,然后它就可以工作了。 - Tushar Asodariya
10个回答

8

正如@DiyorbekDev所说,你应该使用4.0.1版本。4.2.x适用于Flutter 3,并存在一些空安全不兼容性问题。

你不需要将percent_indicator库添加到本地项目中。我曾经遇到过同样的问题。我不得不强制pubspec.yaml使用4.0.1版本:

percent_indicator: 4.0.1

OBS: 不要使用^4.0.1(出于某种原因,它会拉取最新版本[4.2.1] for me)


好的,谢谢分享。我不知道4.0.1会起作用,我会尝试并告诉你。 - Tushar Asodariya
同样的问题,我把4.0.1改成了拉取4.2.1版本percent_indicator: git: url: https://github.com/diegoveloper/flutter_percent_indicator ref: 686feb842d7144c3c45f8ce8d305a380416f3b67 - Mustafa Ali Dikçinar
脱帽致敬,这正是问题所在! - a.utfull.day

4

你的?位置错误。请尝试将代码更改为以下内容

// WidgetsBinding?.instance.addPostFrameCallback
-> WidgetsBinding.instance?.addPostFrameCallback

3

你应该进行更改

WidgetsBinding?.instance.addPostFrameCallback

to

WidgetsBinding.instance?.addPostFrameCallback

2

似乎该包将空安全操作符放在了WidgetsBinding类上而不是实例上。

dart:162:5: 警告:无法将类'WidgetsBinding'设置为null。请尝试用'.'替换'?' WidgetsBinding.instance.addPostFrameCallback((_) { ^^^^^^^^^^^^^^

正确的写法应该是:

WidgetsBinding.instance?.addPostFrameCallback((_) {

2
请使用 percent_indicator 版本 4.0.1。更高版本是针对 Flutter 3.0 定制的,因此您会遇到错误。或者将 Flutter 升级到 3.0 版本。

enter image description here

enter image description here


1
不是这种情况。他正在使用Flutter 2.10.3。 - Eric
请查看以下链接:https://github.com/diegoveloper/flutter_percent_indicator/commit/f51e758488ecfbe56bff5c85a22bde3a00536013 - DiyorbekDev
是的,我明白你的意思,你说得对。但是请看一下线程创建者的Flutter Doctor输出。 - Eric

1

pubspec.yaml中的percent_indicator依赖项更改为:

percent_indicator: #update flutter 3
git:
  url: https://github.com/XuannThucc/flutter_percent_indicator.git
  ref: be51b3d56e729ca1889f77a5f6311b5287fa611d

尝试了这个,但仍然出现相同的错误。 - Tushar Asodariya
你尝试过运行Flutter clean来清除缓存并重新构建吗? - Xuuan Thuc
是的,在将percent_indicator git repo添加到pubspec.yaml后,我执行了flutter clean然后执行了flutter pub get,还尝试了使Android Studio失效并重启,但都没有奏效。 - Tushar Asodariya

0

通过将percent_indicator库添加到本地项目中,问题已解决。

我所做的更改如下:

WidgetsBinding?.instance.addPostFrameCallback((_) {
                             ^^^^^^^^^^^^^^^^^^^^

转换成这个

WidgetsBinding?.instance?.addPostFrameCallback((_) {
                             

它正在工作


我遇到了同样的问题。你所说的“将percent_indicator库添加到本地项目”是什么意思? - user2570135
克隆 GitHub 存储库代码并将其放入您的项目中,然后进行必要的更改,或将您的项目更新到最新的 Flutter 版本或软件包。 - Tushar Asodariya

0

我之前遇到了这个错误,以下是我如何解决的:

我有一个Flutter依赖项,必须将其降级到非常旧的版本,对于您的情况是percent_indicator-4.2.1。

进入pubspec.yaml文件

将percent_indicator-4.2.1版本降级到旧版本

请告诉我是否有帮助。


0

0

变更

nb_utils: ^4.4.17

nb_utils: 4.4.17

pubspec.yaml


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接