Конструктор будущего в StatelessWidget - 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, future: in Futurebuilder не вызывается.

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'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          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 используется в виджете без сохранения состояния?


person gputhige    schedule 23.10.2020    source источник
comment
_dbHelper не инициализирован, я думаю   -  person UTKARSH Sharma    schedule 23.10.2020
comment
Спасибо @UTKARSHSharma - это решает проблему. _DbHelper не был инициирован.   -  person gputhige    schedule 23.10.2020
comment
пожалуйста, проголосуйте за мой ответ, который поможет мне, если вы сочтете его правильным. @gputhige   -  person UTKARSH Sharma    schedule 23.10.2020


Ответы (1)


Вместо того, чтобы печатать _count, вам нужно использовать snapshot.data, чтобы получить значение, возвращаемое из _getCat.

return Container(
              child: Text('Printing ${snapshot.data}'),
            );
person Ravi Singh Lodhi    schedule 23.10.2020