flutter - 初始化一个问题Flutter LateInitializationError 中的变量:字段“____”尚未初始化
问题描述
Flutter 的新手。我的代码运行但遇到
在构建 FutureBuilder(dirty, state: _FutureBuilderState#e1a6f) 时引发了以下 LateError:LateInitializationError:字段“initialPosition”尚未初始化。
代码是设置一个从设备获取初始位置的 GoogleMap 小部件。我收到带有该错误的红色屏幕,但几秒钟后,坐标被接收并正常进行,并正确显示地图和位置。也尝试过未来,但我得到了其他错误。它应该在 FutureBuilder 下吗?在 wrapper.dart 或我的 main.dart 中?
home.dart:
import 'package:flutter/material.dart';
import 'package:something/services/auth.dart';
import 'screens/map.dart';
import 'package:something/services/geolocator_service.dart';
class LakoApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<LakoApp> {
final AuthService _auth = AuthService();
final _geolocatorService = GeolocatorService();
late var initialPosition;
// @override
Future getInitialPosition <Position>() async {
initialPosition = await _geolocatorService.getInitialLocation();
return initialPosition;
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: FittedBox(
child: Text('Something something'),
),
actions: <Widget>[
// irrelevant code
// .....
],
body:
FutureBuilder(
future: getInitialPosition(),
builder: (context, snapshot) {
return Map(initialPosition);
}
)
);
}
}
解决方案
Future Builders 甚至在获取数据之前就已经构建好了。所以,你应该检查它是否有数据。
if (snapshot.hasData) {
return Map(initialPosition); //Or snapshot.data.
}else{
return CircularProgressIndicator();
}
这里还有其他问题。我将展示一些进一步的代码来改进您自己的代码。
您的方法返回接收名为 Position 的通用参数的任何类型的 Future。我认为您想使用一种称为位置的数据类型,因为您现在需要将其移至<Position>
此处,因为您现在编写它的方式对您的特定示例无用。
Future<Position> getInitialPosition () async {
initialPosition = await _geolocatorService.getInitialLocation();
return initialPosition;
}
FutureBuilder 可以是这样的。
FutureBuilder<Position>(
future: getInitialPosition(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Map(snapshot.data);
}else{
return CircularProgressIndicator();
//Display loading, you may adapt this widget to your interface or use some state management solution
}
}
)
推荐阅读
- reactjs - 即使 UI 与它的 react-router 路由不匹配,它是否可以保持呈现?
- x86-64 - 了解延迟有界 memcpy/memset x86_64 中的因素
- macos - 在 macOS Mojave 10.14.6 上找不到 _ctermid.h
- r - 长到更宽的格式
- excel - 我的变量 filename2 没有打开,我不知道为什么
- html - VBA 创建比较网站 Scraper
- amazon-rds - 如何跳过 DMS 任务“完全加载 + 持续复制”中目标数据库中删除的记录的 DMS 验证?
- c# - Component.CompareTag() 和 GameObject.CompreTag() 有什么区别?
- postgresql - PostgreSQL 中基于 2 个条件的 COUNT 值
- c# - 我试图让敌人跟随我的玩家并且它有这个错误