【问题标题】:How can my Flutter FutureBuilder change text at multiple places in my layout?我的 Flutter FutureBuilder 如何在布局中的多个位置更改文本?
【发布时间】:2019-03-17 10:13:06
【问题描述】:

我仔细阅读了 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”。

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

有什么想法/建议吗?

【问题讨论】:

标签: flutter


【解决方案1】:

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

这是一个例子:

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

【讨论】:

    【解决方案2】:

    您可以将您的请求转换为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 中进行更改

    【讨论】:

      猜你喜欢
      • 2020-08-16
      • 2021-02-09
      • 2023-03-08
      • 2022-12-20
      • 2011-02-28
      • 2018-04-03
      • 2020-12-10
      • 2021-10-11
      • 2022-11-11
      相关资源
      最近更新 更多