Flutter 颤振-方法'|';在null上调用了。热重新加载后,它开始工作

Flutter 颤振-方法'|';在null上调用了。热重新加载后,它开始工作,flutter,statefulwidget,Flutter,Statefulwidget,我是个新手。我不知道在后台发生了什么,因为热加载后它的工作很好。在另一个发生的dart文件中,firebase不会在热重新加载后向我提供初始化数据 class CityServices { getCites() { return Firestore.instance.collection('cities').getDocuments(); } } class _HomeScreenState extends State<HomeScreen

我是个新手。我不知道在后台发生了什么,因为热加载后它的工作很好。在另一个发生的dart文件中,firebase不会在热重新加载后向我提供初始化数据

class CityServices {
      getCites() {
        return Firestore.instance.collection('cities').getDocuments();
      }
    }

class _HomeScreenState extends State<HomeScreen> {
  bool citiesFlag = false;
  var cities;
  int citiesCount;
  String actualCity;

让我解释一下这个问题及其原因,然后提出一些解决方案

initState
内部,您正在调用
CityServices().getCites()。然后…
这是一个
async
方法。
但是,当您的小部件第一次构建时,您期望从Firestore获得的数据还没有准备好,因此您将获得
城市
城市计数
null

短期解决方案:
确保有空检查,在等待数据时显示指示器

body: Center(
   child: (cities == null) ? 
     CircularProgressIndicator()
     : Container(...
此外,您还可以将
initState
重构为如下内容

void getCities() async {
   var snapshot CityServices().getCites();
   setState(() {
        citiesFlag = true;
        cities = snapshot.documents;
        citiesCount = snapshot.documents.length;
      });
}

@override
  void initState() {
    getCities();  
    super.initState();
  }
长期解决方案:
使用
BLoC
模式,使数据加载与UI分离。

请参阅以了解如何实施它。

让我解释一下这个问题及其原因,然后提出一些解决方案

initState
内部,您正在调用
CityServices().getCites()。然后…
这是一个
async
方法。
但是,当您的小部件第一次构建时,您期望从Firestore获得的数据还没有准备好,因此您将获得
城市
城市计数
null

短期解决方案:
确保有空检查,在等待数据时显示指示器

body: Center(
   child: (cities == null) ? 
     CircularProgressIndicator()
     : Container(...
此外,您还可以将
initState
重构为如下内容

void getCities() async {
   var snapshot CityServices().getCites();
   setState(() {
        citiesFlag = true;
        cities = snapshot.documents;
        citiesCount = snapshot.documents.length;
      });
}

@override
  void initState() {
    getCities();  
    super.initState();
  }
长期解决方案:
使用
BLoC
模式,使数据加载与UI分离。

有关如何实现它的信息,请参阅。

错误消息已消失。但现在,在应用程序开始时,指示器旋转,旋转,我的应用程序还没有启动。这是我的主.dart文件。void main()=>runApp(JaszEtlap());类JaszEtlap扩展了无状态小部件{final appTitle='A JÁSZSÁGÉTLAPJA';@覆盖小部件构建(BuildContext context){return MaterialApp(initialRoute:HomeScreen.id,routes:{HomeScreen.id:(context)=>HomeScreen()}听起来不错。我刚刚用附加的example.btw更新了我的答案。处理异步数据(即从Firestore加载的数据)的方式需要与UI分离。因此,我建议您使用
flatter\u bloc
,查看答案中共享的链接。请记住,如果答案解决了您的问题,请接受并投票。见指南谢谢你的帮助beerstorm!错误信息已消失。但现在,在应用程序开始时,指示器旋转,旋转,我的应用程序还没有启动。这是我的主.dart文件。void main()=>runApp(JaszEtlap());类JaszEtlap扩展了无状态小部件{final appTitle='A JÁSZSÁGÉTLAPJA';@覆盖小部件构建(BuildContext context){return MaterialApp(initialRoute:HomeScreen.id,routes:{HomeScreen.id:(context)=>HomeScreen()}听起来不错。我刚刚用附加的example.btw更新了我的答案。处理异步数据(即从Firestore加载的数据)的方式需要与UI分离。因此,我建议您使用
flatter\u bloc
,查看答案中共享的链接。请记住,如果答案解决了您的问题,请接受并投票。见指南谢谢你的帮助beerstorm!