首页 > 解决方案 > 输入'未来' 不是 'Widget' 类型的子类型

问题描述

我是 Flutter 的新手。我在构造函数中调用未来方法时遇到问题。我创建了一个方法,该方法返回一个带有小部件的类,取决于所选项目。问题是我需要多次调用这个方法,第一次构建body,第二次更新body on tap。但是我看到错误“类型'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
                      },
                    ),)])...}

标签: flutter

解决方案


_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,
          ],
        ),
      ),
    );
  }
}

推荐阅读