#flutter #dart #asynchronous #io
#трепетать #дротик #асинхронный #io
Вопрос:
Чтобы решить первую проблему, метод, который я сейчас использую, заключается в том, чтобы поместить content
переменную во body
время асинхронной загрузки файла, а когда загрузка будет завершена, вызвать setState()
и установить значение content
.
class _MyHomePageState extends Statelt;MyHomePagegt;{ dynamic content; void setContent(bool? hasRes){ setState(() { if(hasRes!=nullamp;amp;hasRes){ content = const ContentWhenHasRes(); }else{ content = const ContentWhenNoRes(); } }); } @override Widget build(BuildContext context){ //Load the $hasRes$ var and determine which interface to draw SharedPreferences.getInstance().then((pref) =gt; { setContent(pref.getBool('hasRes')) }); return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: content ); } }
Но я не знаю, работает ли это и есть ли более элегантный способ сделать это? Кроме того, я нахожу проблематичным загружать список из локального хранилища для отображения в ListView. Я знаю, что нужно использовать «ListView.builder», однако моя проблема все еще связана с частью ввода-вывода.
Ответ №1:
другой подход-setState() переменная hasRes:
class _MyHomePageState extends Statelt;MyHomePagegt;{ bool _hasRes = false; @override void initState() { super.initState(); //Do this in initState() SharedPreferences.getInstance().then((pref) =gt; { _hasRes = pref.getBool('hasRes'); setState((){}); }); } @override Widget build(BuildContext context){ return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: _hasRes ? ContentWhenHasRes() : ContentWhenNoRes(), ); } }
Ответ №2:
SharedPreferences.getInstance().then((pref) =gt; { setContent(pref.getBool('hasRes')) });
Этот код не следует помещать в метод build (), поскольку метод build() выполняется часто, вместо этого поместите код ввода-вывода в initState ().