【问题标题】:Future returning null first time未来第一次返回 null
【发布时间】:2021-05-25 15:04:47
【问题描述】:

这是一个使用 Google Place 的课程:

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();
  }
}

现在,当我调用 loadPlaces() 时,第一次总是使 _places 为空。我第二次调用它,它工作得很好。我错过了什么?

这是使用上述类的类:

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),
                          ),
                      ),
                    );
                  },
                ),
        ),
      ],
    );
  }
}

我已在此处添加了整个应用程序。正如我提到的,当第一次按下测试按钮时,_places 的值保持为空。第二次,该值很好,并且 ListView 已正确填充。

【问题讨论】:

  • 你在哪里以及如何在你的代码中调用loadPlaces()
  • 来自一个函数: void getPlaces(BuildContext context) { Provider.of(context, listen: false).loadPlaces(); } 一个按钮点击触发它。
  • 请同时发布
  • 刚刚发布了完整的代码

标签: flutter future provider


【解决方案1】:

您必须为所有两个过程使用一个变量: 在事件按钮中,调用变量: 代码:

 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),
                      ),
                  ),
                );
              },
            ),
    ),
  ],
);
  }
}

希望对你有帮助

【讨论】:

  • 但是“loadPlaces()”不是“places”的成员。我不能这样称呼它。
猜你喜欢
  • 2019-05-01
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
相关资源
最近更新 更多