错误:必须返回非空值,因为返回类型“Widget”不允许为空

Nin*_*udj 2 flutter flutter-futurebuilder

使用 FutureBuilder,我收到以下错误。

错误:参数类型“AsyncSnapshot”无法分配给参数类型“Position”。
指向线:return Map(snapshot);

错误:必须返回非空值,因为返回类型“Widget”不允许为空。指向行:构建器:(上下文,快照)

主页.dart

 Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: FittedBox(
            child: Text('something something'),
          ),
          actions: <Widget>[
           //irrelevant code for buttons etc

        ],
   body: FutureBuilder <Position> (
        future: _geolocatorService.getInitialLocation(),
        builder: (BuildContext context, snapshot) {

              if (snapshot.hasData) {   //<- can confirm snapshot has data and can display it 
                                        //  printed in terminal ex.: lat value, long, 
                                        // null,null
                                             
              print(snapshot);
              return Map(snapshot);    //<-having trouble passing snapshot data as Position to 
                                       //  this map
               }
              }
         ),
);
Run Code Online (Sandbox Code Playgroud)

geolocator_service.dart 文件:(导入到 home.dart):

class GeolocatorService {

  Stream<Position> getCurrentLocation()  {
        return Geolocator.getPositionStream(desiredAccuracy: LocationAccuracy.best,distanceFilter: 10);
  }

    Future <Position> getInitialLocation() async {
            return await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.best);
  }`
Run Code Online (Sandbox Code Playgroud)

Map.dart文件(导入必要的插件):

class Map extends StatefulWidget {

  final Position initialPosition;

  Map(this.initialPosition);  // <- initialPosition doesnt like the snapshot value

  @override
  _MapState createState() => _MapState();
}

class _MapState extends State<Map> {

  final GeolocatorService geolocatorService = GeolocatorService();

  @override


  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: GoogleMap(
          initialCameraPosition: CameraPosition(
              target: LatLng( widget.initialPosition.latitude, widget.initialPosition.longitude),
              zoom: 19),
              mapType: MapType.normal,
        ) ,
      )
      );

  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果我删除 if 条件:

body: FutureBuilder <Position> (
            future: _geolocatorService.getInitialLocation(),
            builder: (context, snapshot) {
              
              return Map(snapshot.data!);

                   }
Run Code Online (Sandbox Code Playgroud)

它运行了,我收到一个简短的红屏错误:

构建 FutureBuilder>>>> 时抛出以下 _CastError(脏,状态:_FutureBuilderState#55f91):对 null 值使用 Null 检查运算符

然后照常运行。也许是因为它正在等待数据进入?

The*_*erc 6

您需要在其他条件下返回一个小部件。然后builder需要一个小部件,当您添加 if 条件时,它不会返回任何小部件,直到 if 条件获得 true 值并返回小部件。

Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: FittedBox(child: Text('something something')),
    body: FutureBuilder <Position> (
      future: _geolocatorService.getInitialLocation(),
      builder: (BuildContext context, snapshot) {
        if (snapshot.hasData) {  
          //<- can confirm snapshot has data and can display it 
          //  printed in terminal ex.: lat value, long, 
          // null,null
          print(snapshot);
          return Map(snapshot);
        }else{

        /// Display a loader untill data is not fetched from server
        return CirclularProgressIndicator(); 
      }
   }
 ),
);
Run Code Online (Sandbox Code Playgroud)