StatelessWidget中的Futurebuilder-Flutter

问题描述

我在Stateful Widget和将来的代码中包含以下代码:在Futurebuilder中正确调用函数_getCategory()

class Categories extends StatefulWidget {
  @override
  _Categoriesstate createState() => _Categoriesstate();
}

class _Categoriesstate extends State<Categories> {
  List<AllAccounts> _allaccounts;
  DatabaseHelper _dbHelper;
  int _count = 0;

  @override
  void initState() {
    super.initState();
    setState(() {
      _dbHelper = DatabaseHelper.instance;
    });
    _getCategory();
  }

  Future _getCategory() async {
    List<AllAccounts> x = await _dbHelper.getCategory();
    setState(() {
      _allaccounts = x;
    });
    _count = _allaccounts.length;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Add/Edit Categories'),),body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,children: [
            SizedBox(
              height: 20.0,Text('Select a Category',style: TextStyle(fontSize: 18.0),SizedBox(
              height: 20.0,_list(),],);
  }

  _list() =>
      Expanded(
        child: ListView.builder(
          itemCount: _count,itemBuilder: (context,position) {
            return Card(
              color: Colors.grey[600],elevation: 2.0,child: ListTile(
                leading: Icon(Icons.group),title: Text(_allaccounts[position].category,style: TextStyle(fontSize: 17.0),trailing: Icon(Icons.arrow_forward),onTap: (){},);
          },);

}

但是,当我在StatelessWidget中尝试相同的操作时,futurebuilder中的future:不会被调用

class Test extends StatelessWidget {
  List<AllAccounts> _allaccounts;
  DatabaseHelper _dbHelper;
  int _count = 0;


  Future<int> _getCat() async {
    List<AllAccounts> x = await _dbHelper.getCategory();
    _allaccounts = x;
    _count = x.length;
    print(_count);
    return _count;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Test'),children: [
            _list(),);
  }

  _list() => Expanded(
        child: FutureBuilder<int>(
          builder: (context,snapshot) {
            if (snapshot.connectionState == ConnectionState.none &&
                snapshot.hasData == null) {
              return Center(
                child: CircularProgressIndicator(),);
            }
            return Container(
              child: Text('Printing $_count'),future: _getCat(),);
}

Text('Printing $ _count)返回'Printing 0'。 _getCat()函数中的打印内容也不会在控制台中显示

在无状态小部件中使用Futurebuilder的方式是否存在问题?

解决方法

您需要使用_count来获取snapshot.data返回的值,而不是打印_getCat

return Container(
              child: Text('Printing ${snapshot.data}'),);