Flutter 我的Flatter FutureBuilder如何在布局中的多个位置更改文本?

Flutter 我的Flatter FutureBuilder如何在布局中的多个位置更改文本?,flutter,Flutter,我仔细阅读了颤振教程;从internet获取数据: 我担心的是,我想在我的版面中更新多个文本 该实现仅显示了一种更新方法: FutureBuilder<Post>( future: fetchPost(), builder: (context, snapshot) { if (snapshot.hasData) { return Text(snapshot.data.title); } else if (snapshot.hasError) {

我仔细阅读了颤振教程;从internet获取数据:

我担心的是,我想在我的版面中更新多个文本

该实现仅显示了一种更新方法:

FutureBuilder<Post>(
  future: fetchPost(),
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return Text(snapshot.data.title);
    } else if (snapshot.hasError) {
      return Text("${snapshot.error}");
    }
    // By default, show a loading spinner
    return CircularProgressIndicator();
  },
);
但在《颤栗》中,我目前只能一次使用一个“小部件”

当然,我可以在return参数中提供我的整个布局,但那太疯狂了


有什么想法/建议吗?

另一种策略是在state类中有一个局部变量,并在未来到来时更新它。因此,您可以在任何需要的地方引用该变量

以下是一个例子:

import 'dart:async';

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      home: new MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Post _post = Post("Title 0", "Subtitle0 ", "description 0");

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

  void _getPost() async {
    _post = await fetchPost();
    setState(() {});
  }

  Future<Post> fetchPost() {
    return Future.delayed(Duration(seconds: 4), () {
      return Post("Title new", "Subtitle new", "description new");
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: Center(
        child: Column(
          children: <Widget>[
            new Text(_post.title),
            new Text(_post.subtitle),
            new Text(_post.description),
          ],
        ),
      ),
    );
  }
}

class Post {
  final String title;
  final String subtitle;
  final String description;

  Post(this.title, this.subtitle, this.description);
}
导入'dart:async';
进口“包装:颤振/材料.省道”;
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“颤振演示”,
主页:新MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>new_MyHomePageState();
}
类_MyHomePageState扩展状态{
帖子_Post=帖子(“标题0”、“副标题0”、“描述0”);
@凌驾
void initState(){
super.initState();
_getPost();
}
void\u getPost()异步{
_post=等待fetchPost();
setState((){});
}
未来的fetchPost(){
返回未来。延迟(持续时间(秒:4),(){
回帖(“标题新增”、“副标题新增”、“描述新增”);
});
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:新文本(widget.title),
),
正文:中(
子:列(
儿童:[
新文本(_post.title),
新文本(_post.subtitle),
新文本(_post.description),
],
),
),
);
}
}
班岗{
最后的字符串标题;
最后一串字幕;
最终字符串描述;
Post(this.title,this.subtitle,this.description);
}

您可以将请求转换为

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

class TestWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _TestWidgetState();
}

class _TestWidgetState extends State<TestWidget> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(child: RandomContainer(
        width: 200.0,
        height: 200.0,
        child: Center(child: _MyTextWidget(fetchPost().asStream())),
      ),),
    );
  }

  Future<String> fetchPost() {
    return Future.delayed(Duration(seconds: 4), () {
      return "Title data";
    });
  }

}
class _MyTextWidget extends StatefulWidget {
  _MyTextWidget(this.stream);
  final Stream<String> stream;

  @override
  State<StatefulWidget> createState() => _MyTextWidgetState();
}

class _MyTextWidgetState extends State<_MyTextWidget> {

  String text;

  @override
  void initState() {
    widget.stream.listen((String data) {
      setState(() {
        text = data;
      });
    });
    super.initState();
  }
  @override
  Widget build(BuildContext context) {
    return Text(text == null ? 'loading' : text);
  }

}
导入“包装:颤振/材料.省道”;
导入“包:随机_pk/随机_pk.dart”;
导入“dart:async”;
类TestWidget扩展了StatefulWidget{
@凌驾
State createState()=>\u TestWidgetState();
}
类_TestWidgetState扩展了状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(),
主体:中心(子对象:容器)(
宽度:200.0,
高度:200.0,
child:Center(child:_MyTextWidget(fetchPost().asStream()),
),),
);
}
未来的fetchPost(){
返回未来。延迟(持续时间(秒:4),(){
返回“标题数据”;
});
}
}
类_MyTextWidget扩展StatefulWidget{
_MyTextWidget(this.stream);
最终河流;
@凌驾
State createState()=>\u MyTextWidgetState();
}
类_MyTextWidgetState扩展状态{
字符串文本;
@凌驾
void initState(){
widget.stream.listen((字符串数据){
设置状态(){
文本=数据;
});
});
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回文本(Text==null?“正在加载”:Text);
}
}

在本例中,
RandomContainer
在每个
setState
上更改其颜色,并将其用作指示器,而更改仅在
\u MyTextWidget

中进行,您将需要一个继承的Widget。有关其用法,请参阅是否也要有多个加载指示器?
import 'package:flutter/material.dart';
import 'package:random_pk/random_pk.dart';
import 'dart:async';

class TestWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _TestWidgetState();
}

class _TestWidgetState extends State<TestWidget> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(child: RandomContainer(
        width: 200.0,
        height: 200.0,
        child: Center(child: _MyTextWidget(fetchPost().asStream())),
      ),),
    );
  }

  Future<String> fetchPost() {
    return Future.delayed(Duration(seconds: 4), () {
      return "Title data";
    });
  }

}
class _MyTextWidget extends StatefulWidget {
  _MyTextWidget(this.stream);
  final Stream<String> stream;

  @override
  State<StatefulWidget> createState() => _MyTextWidgetState();
}

class _MyTextWidgetState extends State<_MyTextWidget> {

  String text;

  @override
  void initState() {
    widget.stream.listen((String data) {
      setState(() {
        text = data;
      });
    });
    super.initState();
  }
  @override
  Widget build(BuildContext context) {
    return Text(text == null ? 'loading' : text);
  }

}