在 Flutter 中,有没有办法从存储的文件中绘制不同的内容和动态列表?

In Flutter, is there a way in which I can draw different contents and dynamic lists from the stored file?

提问人:KevinT3Hu 提问时间:12/1/2021 更新时间:12/1/2021 访问量:150

问:

为了解决第一个问题,我目前使用的方法是在异步加载文件时放入一个变量,当加载完成后,调用并设置 .contentbodysetState()content

class _MyHomePageState extends State<MyHomePage>{
  dynamic content;
  void setContent(bool? hasRes){
    setState(() {
      if(hasRes!=null&&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) => {
      setContent(pref.getBool('hasRes'))
    });
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: content
    );
  }
}

但我不知道这是否有效,有没有更优雅的方法可以做到这一点? 此外,我发现从本地存储加载列表以在 ListView 中显示是有问题的。我知道使用“ListView.builder”,但是,我的问题仍然出在 i/o 部分。

Flutter Dart 异步 IO

评论


答:

0赞 聂超群 12/1/2021 #1
SharedPreferences.getInstance().then((pref) => {
  setContent(pref.getBool('hasRes'))
});

这些代码不应该放在 build() 方法中,因为 build() 方法经常执行,所以将 io 代码放在 initState() 中。

0赞 Jim 12/1/2021 #2

另一种方法是 setState() hasRes 变量:

class _MyHomePageState extends State<MyHomePage>{
  bool _hasRes = false;

  @override
  void initState() {
    super.initState();
    //Do this in initState()
    SharedPreferences.getInstance().then((pref) => {
      _hasRes = pref.getBool('hasRes');
      setState((){});
    });
  }

  @override
  Widget build(BuildContext context){
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: _hasRes ? ContentWhenHasRes() : ContentWhenNoRes(),
    );
  }
}