如何分配未来<>在颤动的小部件?

时间:2018-04-11 01:05:06

标签: dart flutter

假设我有一个singleChildScrollView,其内容是从文件中读取的:

new singleChildScrollView(
        padding: new EdgeInsets.all(8.0),
        child: new Text(
          getTextFromFile(), //<---read from file
          style: new TextStyle(
            fontWeight: FontWeight.bold,
            fontSize: 19.0,
          ),
        ));

  Future<String> getFileData(String path) async {
    return await rootBundle.loadString(path);
  }

  Future<String> getTextFromFile() async {
      return getFileData("test.txt");
  }

我收到以下错误:

  

参数类型&#39;未来&#39;不能分配给参数   键入&#39; String&#39;。

如何解决问题?

6 个答案:

答案 0 :(得分:10)

使用FutureBuilder应该可以解决您的问题。我修改了你的代码,你可以看到如何使用它。 <{1}}不是必需的。

initialData

答案 1 :(得分:8)

StatefullWidget可用于此目的。 声明成员变量String _textFromFile = "";在您的州级中,使用setState()方法更新其未来解决方案的价值。

我从构造函数中调用了您的getTextFromFile()方法,但您可以从任何地方调用它。

运行代码:

import 'package:flutter/material.dart';
import 'dart:async';

class StatefullWidgetDemo extends StatefulWidget {
  @override
  _StatefulWidgetDemoState createState() {
    return new _StatefulWidgetDemoState();
  }
}

class _StatefulWidgetDemoState extends State<StatefullWidgetDemo> {
  String _textFromFile = "";

  _StatefulWidgetDemoState() {
    getTextFromFile().then((val) => setState(() {
          _textFromFile = val;
        }));
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Stateful Demo'),
      ),
      body: new SingleChildScrollView(
        padding: new EdgeInsets.all(8.0),
        child: new Text(
          _textFromFile,
          style: new TextStyle(
            fontWeight: FontWeight.bold,
            fontSize: 19.0,
          ),
        ),
      ),
    );
  }

  Future<String> getFileData(String path) async {
    return "your data from file";
  }

  Future<String> getTextFromFile() async {
    return await getFileData("test.txt");
  }
}

答案 2 :(得分:1)

这是一个类似的问题:

flutter / dart error: The argument type 'Future<File>' can't be assigned to the parameter type 'File'

那里提出的解决方案非常优雅并且可以正常工作。 IDE表示期望Type而不是Future<Type>的地方,将await放在该参数前面

答案 3 :(得分:0)

你可能需要一个FutureBuilder。

答案 4 :(得分:0)

获取初始化数据的另一种方法是在getTextFromFile()中调用initState(),使用新字符串设置状态并在小部件中使用该字符串:

String fileData = '';

Future<String> getFileData(String path) async {
    return await rootBundle.loadString(path);
  }

void getTextFromFile() async {
    try {
      String data = await getFileData("test.txt");
      setState(() {
        fileData = data;
      });
    } catch (ex) {
      print(ex);
    }
  }

  @override
  void initState() {
    super.initState();
    getTextFromFile();
  }

new singleChildScrollView(
        padding: new EdgeInsets.all(8.0),
        child: new Text(
          fileData,
          style: new TextStyle(
            fontWeight: FontWeight.bold,
            fontSize: 19.0,
          ),
        ));

答案 5 :(得分:0)

这里简单的答案=>

调用函数的类:

@override
Widget build(BuildContext context) {
return new Scaffold(
 child: FutureBuilder(
  future: function(),
  builder: (BuildContext context, AsyncSnapshot<String> text) {
    return new Text(text.data);
  });
)}

函数:

Future<String> function() async {
   return 'abc';
}