【问题标题】:Flutter : Autorun a function whenever a screen is openedFlutter:每当打开屏幕时自动运行一个函数
【发布时间】:2021-07-19 13:49:52
【问题描述】:

我想在每次加载屏幕时运行一个函数来检查 Firestore 数据。 这是我的代码:

class PlaceTile extends StatefulWidget {
  
  //String flag='inactive';
  
  final Place place;
  PlaceTile({ this.place });

  @override
  _PlaceTileState createState() => _PlaceTileState(place);
}

class _PlaceTileState extends State<PlaceTile> {

  final Place place;
  _PlaceTileState(this.place);
  String flag = 'inactive';

  void getUserById(String id) {
    
    DatabaseService().placesCollection.document(id).get().then((DocumentSnapshot doc) {
      print(doc.data);
  
    });

  }

  checkUserStatus() async {
    
    final FirebaseAuth auth = FirebaseAuth.instance;
    
    final FirebaseUser user  = await auth.currentUser();
    
    String uid = user.uid;
    UserDatabaseService().userCollection.getDocuments().then((QuerySnapshot snapshot) {
      snapshot.documents.forEach((DocumentSnapshot doc) {
        if(doc.documentID == uid)
        {
          if(doc.data['status']=='true')
          {
            setState(() {
              flag = 'active';
            });

          }
          else
          {
            setState(() {
              flag = 'inactive';
            });
          }
        }
        });
    });
      return flag;
  }
      void showQueueDetailsPanel() {
      showModalBottomSheet(context: context, builder: (context) {
        return Container(
          padding: EdgeInsets.symmetric(vertical: 20.0, horizontal: 60.0),
          child: QueueDetails(value: place.name),
        );
      });
    }

  String value;
  @override
    initState() {
    super.initState();
    checkUserStatus();
  }
  Widget build(BuildContext context) {

    return Padding(
      padding: EdgeInsets.only(top: 8.0),
      child: Card(
        margin: EdgeInsets.fromLTRB(20.0, 6.0, 20.0, 0.0),
        child: ListTile(
          isThreeLine: true,
          leading: CircleAvatar(
            radius: 25.0,
            backgroundColor: Colors.white,
          ),
            title: Text(place.name),
            subtitle: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                //Text("People   "+place.totalPeople.toString()),
                Text(""),
                Text("Token    "+place.tokenAvailable.toString()),
              ],
            ),
            
            trailing: FlatButton.icon(
              icon: Icon(Icons.add_box_rounded),
              label: Text('Join'),
              onPressed: checkUserStatus() =='inactive' ? showQueueDetailsPanel : null,
            ),
          ),
        )
    );
    }
}

当前状态下的代码没有按我预期的方式执行。这其实是个谬误。一旦将flag 设置为activeJoin 按钮将被禁用,并且要重新启用它们需要按下它们以检查条件。但这是不可能的,因为按钮被禁用时无法按下。 每次加载带有PlaceTile 的此页面时,我都想运行checkUserStatus()。我怎样才能做到这一点?一个代码 sn-p 会很有帮助。

【问题讨论】:

    标签: firebase flutter google-cloud-firestore mobile-application


    【解决方案1】:

    将你的函数添加到initState:

     @override
      void initState() {
        super.initState();
        checkUserStatus();
      }
    

    【讨论】:

    • 第一次构建小部件时它会运行。你可以把它移到你的构建方法中,在return paddingcheckUserStatus();之前
    【解决方案2】:
    Widget build(BuildContext context) {
    return FutureBuilder(
      future: futurePackageListModel,
      builder: (BuildContext context,
          AsyncSnapshot<List<Model>> snapshot) {
        if (snapshot.hasData) {
          return YourWidget();
        } else if (snapshot.hasError) {
          return ApiStatusFail();
        } else {
          return Center(child: CircularProgressIndicator());
        }
      },
    );
    

    }

    【讨论】:

      猜你喜欢
      • 2018-12-06
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 2020-10-15
      • 2022-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多