В Flutter есть ли способ, которым я могу рисовать различное содержимое и динамические списки из сохраненного файла?

#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 ().