Flutter 我的Flatter FutureBuilder如何在布局中的多个位置更改文本?
我仔细阅读了颤振教程;从internet获取数据: 我担心的是,我想在我的版面中更新多个文本 该实现仅显示了一种更新方法: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) {
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);
}
}