首页 文章

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

提问于
浏览
2

我仔细阅读了Flutter教程;从互联网上获取数据:https://flutter.io/cookbook/networking/fetch-data/

我担心的是我想更新布局中的多个文本 .

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

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

这工作正常,一次显示一个视图 .

在Android Studio / Java中,我会做类似的事情:

myTextView1.setText(snapshot.data.data1)
myTextView2.setText(snapshot.data.data2)
myTextView3.setText(snapshot.data.data3)
.....
myTextView10.setText(snapshot.data.data3)

但在Flutter,我目前仅限于一个“Widget” .

当然,我可以在返回参数中提供我的整个布局,但那会很疯狂!

有什么想法/建议吗?

2 回答

  • 0

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

    这是一个例子:

    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);
    }
    
  • 0

    您可以将您的请求转换为 Stream

    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);
      }
    
    }
    

    在此示例中, RandomContainer 在每个 setState 上更改其颜色,并且它作为指示符,而变化仅在 _MyTextWidget

相关问题