[ffigen] Fix #577 (#609)

diff --git a/pkgs/ffigen/lib/src/code_generator/imports.dart b/pkgs/ffigen/lib/src/code_generator/imports.dart
index d6dcd06..93af5ad 100644
--- a/pkgs/ffigen/lib/src/code_generator/imports.dart
+++ b/pkgs/ffigen/lib/src/code_generator/imports.dart
@@ -86,8 +86,8 @@
     ImportedType(ffiImport, 'UnsignedLongLong', 'int', '0');
 final longLongType = ImportedType(ffiImport, 'LongLong', 'int', '0');
 
-final floatType = ImportedType(ffiImport, 'Float', 'double', '0');
-final doubleType = ImportedType(ffiImport, 'Double', 'double', '0');
+final floatType = ImportedType(ffiImport, 'Float', 'double', '0.0');
+final doubleType = ImportedType(ffiImport, 'Double', 'double', '0.0');
 
 final sizeType = ImportedType(ffiImport, 'Size', 'int', '0');
 final wCharType = ImportedType(ffiImport, 'WChar', 'int', '0');
diff --git a/pkgs/ffigen/lib/src/code_generator/native_type.dart b/pkgs/ffigen/lib/src/code_generator/native_type.dart
index d76e7e7..dfb43a5 100644
--- a/pkgs/ffigen/lib/src/code_generator/native_type.dart
+++ b/pkgs/ffigen/lib/src/code_generator/native_type.dart
@@ -36,8 +36,8 @@
     SupportedNativeType.Uint16: NativeType._('Uint16', 'int', '0'),
     SupportedNativeType.Uint32: NativeType._('Uint32', 'int', '0'),
     SupportedNativeType.Uint64: NativeType._('Uint64', 'int', '0'),
-    SupportedNativeType.Float: NativeType._('Float', 'double', '0'),
-    SupportedNativeType.Double: NativeType._('Double', 'double', '0'),
+    SupportedNativeType.Float: NativeType._('Float', 'double', '0.0'),
+    SupportedNativeType.Double: NativeType._('Double', 'double', '0.0'),
     SupportedNativeType.IntPtr: NativeType._('IntPtr', 'int', '0'),
     SupportedNativeType.UintPtr: NativeType._('UintPtr', 'int', '0'),
   };
diff --git a/pkgs/ffigen/test/native_objc_test/block_test.dart b/pkgs/ffigen/test/native_objc_test/block_test.dart
index fd8c491..87a735a 100644
--- a/pkgs/ffigen/test/native_objc_test/block_test.dart
+++ b/pkgs/ffigen/test/native_objc_test/block_test.dart
@@ -101,6 +101,14 @@
       expect(value, 123);
     });
 
+    test('Float block', () {
+      final block = ObjCBlock2.fromFunction(lib, (double x) {
+        return x + 4.56;
+      });
+      expect(block(1.23), closeTo(5.79, 1e-6));
+      expect(BlockTester.callFloatBlock_(lib, block), closeTo(5.79, 1e-6));
+    });
+
     Pointer<Void> funcPointerBlockRefCountTest() {
       final block = ObjCBlock1.fromFunctionPointer(
           lib, Pointer.fromFunction(_add100, 999));
diff --git a/pkgs/ffigen/test/native_objc_test/block_test.m b/pkgs/ffigen/test/native_objc_test/block_test.m
index 5e0174f..9e619b6 100644
--- a/pkgs/ffigen/test/native_objc_test/block_test.m
+++ b/pkgs/ffigen/test/native_objc_test/block_test.m
@@ -6,6 +6,7 @@
 #import <Foundation/NSThread.h>
 
 typedef int32_t (^IntBlock)(int32_t);
+typedef float (^FloatBlock)(float);
 typedef void (^VoidBlock)();
 
 // Wrapper around a block, so that our Dart code can test creating and invoking
@@ -21,6 +22,7 @@
 - (void)pokeBlock;
 + (void)callOnSameThread:(VoidBlock)block;
 + (NSThread*)callOnNewThread:(VoidBlock)block;
++ (float)callFloatBlock:(FloatBlock)block;
 @end
 
 @implementation BlockTester
@@ -86,4 +88,8 @@
   return [[NSThread alloc] initWithBlock: block];
 }
 
++ (float)callFloatBlock:(FloatBlock)block {
+  return block(1.23);
+}
+
 @end