方法调用完成后如何设置状态

时间:2019-05-01 14:53:32

标签: dart flutter

我试图更改isSyncing的状态,然后在等待api.fetchProducts()完成后以设置状态重建小部件。 api.fetchProducts()是我用来从API提取然后使用sqflite本地存储的内容。

我尝试使用cloudSyn.then(),但无法正常工作。

class SyncProgress extends StatefulWidget {

  @override
  _SyncProgressState createState() => _SyncProgressState();
}

class _SyncProgressState extends State<SyncProgress> {
  bool isSyncing = true;
  String progressString = 'Syncing your data....';

  final db = DatabaseHelper();
  final bloc = ProductBloc();

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

  }

  Future cloudSync() async{
    await api.fetchProducts();


  //Here is the challenge

    setState(() {
        isSyncing = false; 
        progressString = 'Syncing complete....';
      });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: isSyncing ? _indicateProgress()  : _syncDone()
    );
  }

 Widget _indicateProgress(){
   return Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            CircularProgressIndicator(),
            SizedBox(height: 50.0,),
            Text(progressString, style: TextStyle(
              fontSize: 16.0,

            ),),
          ],
        ),
      );
 }

 _syncDone(){
   print('Syncing completed');
  //return Navigator.push(context, MaterialPageRoute(builder: (context) => HomePage()));

 }
}

1 个答案:

答案 0 :(得分:0)

使用then强制setState函数仅在fetchProducts()完成后才能执行:

 Future cloudSync() async{
   await api.fetchProducts().then(
     setState(() {
       isSyncing = false; 
       progressString = 'Syncing complete....';
     });
   );
 }