类型'Future <dynamic>'不是类型'Future <Widget>'的子类型

时间:2020-05-24 13:19:13

标签: flutter widget

我有一个问题,我试图解决并阅读许多与之相关的答案。 但是我只是不明白如何使它工作。

我想显示一个主题对象列表,它是一个异步函数,因为主题来自api调用。 所有这些都创建了一个自定义的gridView,所以我很清楚我必须使用FutureBuilder,但是即使使用它,我也会收到此错误消息:

enter image description here

我的代码如下:

 GridView.count(
   crossAxisCount: 2,
   children: <Widget>[
      FutureBuilder<Widget>(
          future: themeColorList.buildCustomGrid(),
          builder: (BuildContext context, AsyncSnapshot<Widget> snapshot) {
            if(snapshot.hasData)
                print("snapshot.data : ${snapshot.data}");
                return snapshot.data;
            return Container(child: CircularProgressIndicator());
          },
      )
   ]
 )

名为的函数

 buildCustomGrid() async {
    List<ProjectTheme> themeList = await constructTheme();

    List.generate(themes.length, (index) {
       return Container(
         child: Center(
           child: Text(themeList[index].themeName),
         ),
      color: themeList[index].themeColor,
  );
});

}

确定我错过了一些事情,我试图用“ Future List Widget”替换“ Future Widget”(因为它实际上是一个已创建的列表),但错误是相同的,只是第二部分被“ Future List”所取代小部件”。

能帮我吗?

所以我有了一些开始(不再显示错误)。 我必须做这样的事情:

GridView.count(
  crossAxisCount: 2,
  children: <Widget>[
     FutureBuilder<List<Widget>>(
        future: themeColorList.buildCustomGrid(),
        builder: (BuildContext context, AsyncSnapshot<List<Widget>> snapshot){
         if(snapshot.hasData) {
            for(int i = 0; i< snapshot.data.length; i++) {
             print("snapshot.data : ${snapshot.data[i]}");
             return snapshot.data[i];
            }
          }
          return Container(child: CircularProgressIndicator());
        },
      )
    ]
)

这:

Future<List<Widget>> buildCustomGrid() async {
  List<ProjectTheme> themeList = await constructTheme();

  return List.generate(themes.length, (index) {
    return Container(
     child: Center(
        child: Text(themeList[index].themeName),
     ),
    color: themeList[index].themeColor,
  );
 });
}

当然,它只显示第一个列表元素,这也不好。必须看看如何处理。

2 个答案:

答案 0 :(得分:1)

我为您制作了完整的工作代码:

import 'package:flutter/material.dart';

final Color darkBlue = Color.fromARGB(255, 18, 32, 47);

void main() {
  runApp(MyApp());
}

class ProjectTheme {
  String themeName;
  Color themeColor;

  ProjectTheme({this.themeName, this.themeColor});
}

class MyApp extends StatelessWidget {
  Future<List<ProjectTheme>> getThemes() async {
    List<ProjectTheme> themeList = [
      ProjectTheme(themeName: "red", themeColor: Colors.red),
      ProjectTheme(themeName: "green", themeColor: Colors.green),
      ProjectTheme(themeName: "blue", themeColor: Colors.blue),
    ];
    return themeList;
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
            child: FutureBuilder<List<ProjectTheme>>(
          future: getThemes(),
          builder: (BuildContext context,
              AsyncSnapshot<List<ProjectTheme>> snapshot) {
            if (snapshot.hasData)
              return GridView.count(
                crossAxisCount: 2,
                children: snapshot.data
                    .map(
                      (theme) => Container(
                        child: Center(
                          child: Text(theme.themeName),
                        ),
                        color: theme.themeColor,
                      ),
                    )
                    .toList(),
              );
            return Container(child: CircularProgressIndicator());
          },
        )),
      ),
    );
  }
}

主要是将GridView放在FutureBuilder中。 我还重构了“ buildCustomGrid”方法,以使其不应该返回小部件。

希望它能提供帮助!

答案 1 :(得分:0)

您可以尝试从构建器中删除“窗口小部件”吗?因为它可以将其视为类,并且可能是导致错误的原因

self

或使用动态代替:

ai_game