Flutter 首次返回空值
下面是一个使用Google Place的类:Flutter 首次返回空值,flutter,future,provider,Flutter,Future,Provider,下面是一个使用Google Place的类: class PlaceProvider extends ChangeNotifier { NearBySearchResponse _places; NearBySearchResponse get getPlaces => _places; GooglePlace googlePlace; PlaceProvider() { loadAPI(); } void loadAPI() async {
class PlaceProvider extends ChangeNotifier {
NearBySearchResponse _places;
NearBySearchResponse get getPlaces => _places;
GooglePlace googlePlace;
PlaceProvider() {
loadAPI();
}
void loadAPI() async {
await DotEnv.load(fileName: '.env');
googlePlace = GooglePlace(DotEnv.env['API_KEY']);
}
Future<void> loadPlaces() async {
print('We are here');
_places = await googlePlace.search.getNearBySearch(
Location(lat: 40.79, lng: -73.96), 1500,
type: "restaurant", keyword: "hamburger");.
notifyListeners();
}
}
class PlaceProvider扩展了ChangeNotifier{
附近的应急地点;
NearBySearchResponse get getPlaces=>\u places;
谷歌广场;
PlaceProvider(){
loadAPI();
}
void loadAPI()异步{
等待DotEnv.load(文件名:'.env');
googlePlace=googlePlace(DotEnv.env['API_KEY']);
}
Future loadPlaces()异步{
打印(“我们在这里”);
_places=wait googlePlace.search.getNearBySearch(
位置(纬度:40.79,液化天然气:-73.96),1500,
键入:“餐厅”,关键字:“汉堡包”);。
notifyListeners();
}
}
现在,当我调用loadPlaces()时,它第一次总是使_placesnull。我第二次打电话时,效果很好。我错过了什么
下面是使用上述类的类:
class SearchPage extends StatelessWidget {
const SearchPage({Key key}) : super(key: key);
void testPlaces(BuildContext context) {
Provider.of<PlaceProvider>(context, listen: false).loadPlaces();
}
@override
Widget build(BuildContext context) {
NearBySearchResponse places = Provider.of<PlaceProvider>(context).getPlaces;
return Column(
children: [
Text('Search Page'),
ElevatedButton(
onPressed: () {
testPlaces(context);
},
child: Text('Test'),
),
Expanded(
child: places == null
? Container(child: CupertinoActivityIndicator(radius: 50.0))
: ListView.builder(
itemCount: places.results.length,
itemBuilder: (context, index) {
return Container(
color: Colors.grey[(index * 200) % 400],
child: Center(
child: Text(
places.results[index].name,
style: TextStyle(fontSize: 18.0),
),
),
);
},
),
),
],
);
}
}
class SearchPage扩展了无状态小部件{
const SearchPage({Key}):super(Key:Key);
void testPlaces(构建上下文){
Provider.of(context,listen:false).loadPlaces();
}
@凌驾
小部件构建(构建上下文){
NearBySearchResponse places=Provider.of(context.getPlaces);
返回列(
儿童:[
文本(“搜索页”),
升降按钮(
已按下:(){
测试地点(上下文);
},
子项:文本('Test'),
),
扩大(
子:places==null
?容器(儿童:铜活动指示器(半径:50.0))
:ListView.builder(
itemCount:places.results.length,
itemBuilder:(上下文,索引){
返回容器(
颜色:颜色。灰色[(索引*200)%400],
儿童:中心(
子:文本(
places.results[index].name,
样式:TextStyle(fontSize:18.0),
),
),
);
},
),
),
],
);
}
}
我已经在这里添加了整个应用程序。正如我提到的,当第一次按下测试按钮时,_places的值保持为空。第二次,该值正常,并且ListView已正确填充。必须为所有两个进程使用一个变量: 在事件按钮中,调用变量: 代码:
class SearchPage扩展了无状态小部件{
const SearchPage({Key}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
NearBySearchResponse places=Provider.of(context,listen:false);
返回列(
儿童:[
文本(“搜索页”),
升降按钮(
已按下:(){
places.loadPlaces();
},
子项:文本('Test'),
),
扩大(
子:places==null
?容器(儿童:铜活动指示器(半径:50.0))
:ListView.builder(
itemCount:places.results.length,
itemBuilder:(上下文,索引){
返回容器(
颜色:颜色。灰色[(索引*200)%400],
儿童:中心(
子:文本(
places.results[index].name,
样式:TextStyle(fontSize:18.0),
),
),
);
},
),
),
],
);
}
}
我希望我能帮助您在代码中调用
loadPlaces()
的位置和方式?通过一个函数:void-getPlaces(BuildContext){Provider.of(context,listen:false).loadPlaces();}单击一个按钮就会触发此消息。请发布该消息,同时发布完整的代码,但“loadPlaces()”不是“places”的成员。我不能这样说。
class SearchPage extends StatelessWidget {
const SearchPage({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
NearBySearchResponse places = Provider.of<PlaceProvider>(context,listen: false).getPlaces;
return Column(
children: [
Text('Search Page'),
ElevatedButton(
onPressed: () {
places.loadPlaces();
},
child: Text('Test'),
),
Expanded(
child: places == null
? Container(child: CupertinoActivityIndicator(radius: 50.0))
: ListView.builder(
itemCount: places.results.length,
itemBuilder: (context, index) {
return Container(
color: Colors.grey[(index * 200) % 400],
child: Center(
child: Text(
places.results[index].name,
style: TextStyle(fontSize: 18.0),
),
),
);
},
),
),
],
);
}
}