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

时间:2019-11-24 09:28:24

标签: flutter

我是Flutter的新手。 我在构造函数中调用future方法有问题。我创建方法,该方法返回带有小部件的类,取决于所选项目。问题是我需要多次调用此方法,第一次是构建主体,第二次是在点击时更新主体。但是我看到错误“类型'Future'不是类型'Widget'的子类型”。如果我添加void类型而不是Future,它将执行一次以创建主体。 代码段:

class DataPageState extends State<DataPage> {
....
    _tables() async {
    if (selectedValue == "a") {
      return DataA();
    }
    if (selectedValue == "b") {
      return DataB();
    }
    if (selectedValue == "c") {
      return DataC();
    }
  }

 @override
  Widget build(BuildContext context) {
    return MaterialApp(...
body: new Stack(children: <Widget>[
          _tables(), //errors this  //I need to call method this
         ... new Stack(children: <Widget>[
              AnimatedContainer(...),
                      InkWell(onTap: () => setState(
                      () {
                        _tables(); //and this
                      },
                    ),)])...}

3 个答案:

答案 0 :(得分:0)

您的_tables()函数应返回一些Widget。如果要使用异步调用构建Widget,可以使用FutureBuilder

答案 1 :(得分:0)

_tables()不能异步。您必须返回Widget而不是Future<widget>

这是有关如何在单击时添加小部件的演示。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Home(),
    );
  }
}

class Home extends StatefulWidget {
  Home({Key key}) : super(key: key);
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  Widget _add = Container();

  test() {
    _add = Text("datcdsvcdsvsvdjvkjdsvsa");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Demo"),
      ),
      body: Container(
        child: Stack(
          children: <Widget>[
            RaisedButton(
              color: Colors.amber,
              child: Text("Press"),
              onPressed: () {
                setState(() {
                  test();
                });
              },
            ),
            _add,
          ],
        ),
      ),
    );
  }
}

答案 2 :(得分:0)

您可能应该编辑函数 _tables 以使其同步。 像这样:

Widget _tables() {
  if (selectedValue == "a") {
    return DataA();
  }
  if (selectedValue == "b") {
    return DataB();
  }
  if (selectedValue == "c") {
    return DataC();
  }
}



现在,如果您有理由使 _tables 异步,请执行以下操作:


Tables 是一种 Future 类型。为此,您需要一个`futureBuilder`。
Stack(children: <Widget>[
  FutureBuilder<Widget>(
    future: _tables(),
    builder: (BuildContext _, snapshot) {
      if(snapshot.hasError) { // Error
        return const MyErrorWidget(); // You will have to create this widget
      } else if(!(snapshot.hasData)) { // Loading
        return CircularProgressIndicator();
      }/ Loaded without any errors
      return snapshot.data; // The widget that was returned;
    },
  ),
  // the rest of the widgets in the Stack
]);

现在这不能解决问题。您必须将返回类型添加到 _tables()。 这样做

Future<Widget> _tables() async {