Flutter/Dart - 在我的构建中使用 FutureBuilder 和 Normal 非异步元素?

标签 flutter dart future flutter-provider flutter-change-notifier

我不确定如何实现 FutureBuilder元素以及我的构建树中的其他非异步元素。我正在使用 Consumer 的事实监听 ChangeNotifierprovider 中的变化使事情有些复杂化。我可以同时使用提供者和 FutureBuilder 吗?在以下代码中,我需要访问的相关 future 是 socialProvider.currentavatarsocialProvider.currentname在底部导航栏中。

Widget build(BuildContext context) {
    var socialProvider = Provider.of<SocialProvider>(context);
    return new MaterialApp(
      home: new Scaffold(
        body: _myPages[_selectedIndex],
        
        bottomNavigationBar: BottomNavigationBar(
          type: BottomNavigationBarType.fixed,
          items: <BottomNavigationBarItem>[
          
            BottomNavigationBarItem(
              icon: Icon(Icons.home),
              title: Text('Home'),
            ),
            
            BottomNavigationBarItem(
                  icon: Consumer<SocialProvider>(
                  builder: (context, socialProvider, child) {
                return Image.network(socialProvider.currentavatar);
              }),
              title: Consumer<SocialProvider>(
                  builder: (context, socialProvider, child) {
                return Text(socialProvider.currentname);
              }),
            ),
           ],
          currentIndex: _selectedIndex,
          onTap: _onItemTapped,
       
        ),
      ),
    );
  }
这是我的 SocialProvider with ChangeNotifier 中的代码类(class)。
 class SocialProvider with ChangeNotifier {

  String currentname = loadCurrentName();
  String currentavatar = loadCurrentAvatar();

    loadCurrentName() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String currentname = await prefs.getString('currentname') ?? 'Anonymous';
    return currentname;
}
    loadCurrentAvatar() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String currentavatar = await prefs.getString('currentavatar') ?? "https://example.com/default.png";
    return currentavatar;
}
}
如何实现 FutureBuilder 以便获取 socialProvider.currentname 和 socialProvider.currentavatar?

最佳答案

在 FutureBuilder 中包装你的脚手架。您可以使用 Future.wait在 FutureBuilder 中运行 2 个 future 。由于您没有从 Snapshot 获取数据,因此您可以摆脱这些消费者,除非您计划更新这些字段。

Widget build(BuildContext context) {
  var socialProvider = Provider.of<SocialProvider>(context);
  return new MaterialApp(
    home: FutureBuilder(
      future: Future.wait([socialProvider.loadCurrentName(), socialProvider.loadCurrentAvatar()]),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return Scaffold(
            body: _myPages[_selectedIndex],

            bottomNavigationBar: BottomNavigationBar(
              type: BottomNavigationBarType.fixed,
              items: <BottomNavigationBarItem>[

                BottomNavigationBarItem(
                  icon: Icon(Icons.home),
                  title: Text('Home'),
                ),

                BottomNavigationBarItem(
                  icon: Consumer<SocialProvider>(
                  builder: (context, socialProvider, child) {
                    return Image.network(snapshot.data[1]);
                  }),
                  title: Consumer<SocialProvider>(
                    builder: (context, socialProvider, child) {
                      return Text(snapshot.data[0]);
                    }),
                ),
              ],
              currentIndex: _selectedIndex,
              onTap: _onItemTapped,

            ),
          );
        } else if(snapshot.hasError) {
          // handle error.
        } else{
          // handle loading.

        }
      }
    ),
  );
}
 class SocialProvider with ChangeNotifier {

  String currentname = loadCurrentName();
  String currentavatar = loadCurrentAvatar();

    Future<String> loadCurrentName() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String currentname = await prefs.getString('currentname') ?? 'Anonymous';
    return currentname;
}
    Future<String> loadCurrentAvatar() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String currentavatar = await prefs.getString('currentavatar') ?? "https://example.com/default.png";
    return currentavatar;
}
}

关于Flutter/Dart - 在我的构建中使用 FutureBuilder 和 Normal 非异步元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63155903/

相关文章:

android - 在iOS和Android的flutter项目中运行firebase的最低版本是什么?

flutter - 为什么我无法在控制台上打印对象中的信息

dart - 异步代码的 UnitTest 示例

listview - 我可以使用最初未声明的itemCount定义ListView Builder吗

flutter - 在 flutter 中 IntrinsicHeight 的替代品是什么?

flutter - 如何在flutter中使用CustomPainter绘制圆环?

rust - 为什么我的 Future 实现在被轮询一次并且 NotReady 后被阻止?

flutter - flutter 使用其他文件中的Future返回值

dictionary - Flutter - 如何在我 future builder 文本小部件中获得值(value)返回

colors - 如何在 flutter 中调用带有彩色文本的 print() 到 android studio 控制台