假设我有一个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");
  }
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
参数类型'Future'不能分配给参数类型'String'.
如何解决这个问题?
小智 22
使用FutureBuilder应该可以解决您的问题.我修改了你的代码,你可以看到如何使用它.initialData不需要.
  @override
  Widget build(BuildContext context) {
    return new FutureBuilder(
      future: getTextFromFile(),
      initialData: "Loading text..",
      builder: (BuildContext context, AsyncSnapshot<String> text) {
        return new SingleChildScrollView(
          padding: new EdgeInsets.all(8.0),
          child: new Text(
            text.data,
            style: new TextStyle(
              fontWeight: FontWeight.bold,
              fontSize: 19.0,
            ),
          ));
      });
  }
  Future<String> getFileData(String path) async {
    return await new Future(() => "test text");
  }
  Future<String> getTextFromFile() async {
    return getFileData("test.txt");
  }
}
Run Code Online (Sandbox Code Playgroud)
        Ani*_*753 15
StatefullWidget可以用于此目的.声明成员变量String _textFromFile = ""; 在您的State类中,并使用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");
  }
}
Run Code Online (Sandbox Code Playgroud)
        Ben*_*sal 12
简单回答=>
调用该函数的类:
@override
Widget build(BuildContext context) {
return new Scaffold(
 child: FutureBuilder(
  future: function(),
  builder: (BuildContext context, AsyncSnapshot<String> text) {
    return new Text(text.data);
  });
)}
Run Code Online (Sandbox Code Playgroud)
和功能:
Future<String> function() async {
   return 'abc';
}
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           14248 次  |  
        
|   最近记录:  |