Fix NPE in flutter tools (#34725)

diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart
index 78f8307..564cd08 100644
--- a/packages/flutter_tools/lib/src/android/gradle.dart
+++ b/packages/flutter_tools/lib/src/android/gradle.dart
@@ -509,7 +509,7 @@
   flutterUsage.sendTiming('build', 'gradle-v2', Duration(milliseconds: sw.elapsedMilliseconds));
 
   if (!isBuildingBundle) {
-    final Iterable<File> apkFiles = _findApkFiles(project, androidBuildInfo);
+    final Iterable<File> apkFiles = findApkFiles(project, androidBuildInfo);
     if (apkFiles.isEmpty)
       throwToolExit('Gradle build failed to produce an Android package.');
     // Copy the first APK to app.apk, so `flutter run`, `flutter install`, etc. can find it.
@@ -546,22 +546,23 @@
   }
 }
 
-Iterable<File> _findApkFiles(GradleProject project, AndroidBuildInfo androidBuildInfo) {
+@visibleForTesting
+Iterable<File> findApkFiles(GradleProject project, AndroidBuildInfo androidBuildInfo) {
   final Iterable<String> apkFileNames = project.apkFilesFor(androidBuildInfo);
   if (apkFileNames.isEmpty)
     return const <File>[];
 
-  return apkFileNames.map<File>((String apkFileName) {
+  return apkFileNames.expand<File>((String apkFileName) {
     File apkFile = project.apkDirectory.childFile(apkFileName);
     if (apkFile.existsSync())
-      return apkFile;
+      return <File>[apkFile];
     final BuildInfo buildInfo = androidBuildInfo.buildInfo;
     final String modeName = camelCase(buildInfo.modeName);
     apkFile = project.apkDirectory
         .childDirectory(modeName)
         .childFile(apkFileName);
     if (apkFile.existsSync())
-      return apkFile;
+      return <File>[apkFile];
     if (buildInfo.flavor != null) {
       // Android Studio Gradle plugin v3 adds flavor to path.
       apkFile = project.apkDirectory
@@ -569,9 +570,9 @@
           .childDirectory(modeName)
           .childFile(apkFileName);
       if (apkFile.existsSync())
-        return apkFile;
+        return <File>[apkFile];
     }
-    return null;
+    return const <File>[];
   });
 }
 
diff --git a/packages/flutter_tools/test/android/gradle_test.dart b/packages/flutter_tools/test/android/gradle_test.dart
index 7aafd64..36e6146 100644
--- a/packages/flutter_tools/test/android/gradle_test.dart
+++ b/packages/flutter_tools/test/android/gradle_test.dart
@@ -41,6 +41,18 @@
       expect(shouldBeToolExit, isToolExit);
     });
 
+    // Regression test for https://github.com/flutter/flutter/issues/34700
+    testUsingContext('Does not return nulls in apk list', () {
+      final GradleProject gradleProject = MockGradleProject();
+      const AndroidBuildInfo buildInfo = AndroidBuildInfo(BuildInfo.debug);
+      when(gradleProject.apkFilesFor(buildInfo)).thenReturn(<String>['not_real']);
+      when(gradleProject.apkDirectory).thenReturn(fs.currentDirectory);
+
+      expect(findApkFiles(gradleProject, buildInfo), <File>[]);
+    }, overrides: <Type, Generator>{
+      FileSystem: () => MemoryFileSystem(),
+    });
+
     test('androidXFailureRegex should match lines with likely AndroidX errors', () {
       final List<String> nonMatchingLines = <String>[
         ':app:preBuild UP-TO-DATE',
@@ -537,3 +549,4 @@
 class MockLocalEngineArtifacts extends Mock implements LocalEngineArtifacts {}
 class MockProcessManager extends Mock implements ProcessManager {}
 class MockXcodeProjectInterpreter extends Mock implements XcodeProjectInterpreter {}
+class MockGradleProject extends Mock implements GradleProject {}