【问题标题】:Can I use future builder in one page twice in flutter我可以在一页中使用future builder两次吗
【发布时间】:2020-11-28 02:52:14
【问题描述】:

我已经删除了我之前的问题并用这个问题替换它可能是最清楚的, 我从 API 接收数据并将其转换为 List contains (id , title , description , activity , degree )。 现在我想显示如下图所示的数据: 注意:(所有行中的标题和描述都相同)

课程页面:

class Digree {
  final int index;
  final String title_k;
  final String title_a;
  final String aya;
  final String link;
  final String activity_k;
  final String activity_a;
  final String udigree;
  Digree(this.index, this.title_k, this.title_a, this.aya, this.link,
      this.activity_k, this.activity_a, this.udigree);
}

未来功能页面

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:jiyanUquraan/classes/viewdigree.dart';

class DisplayList extends StatefulWidget {
  @override
  _DisplayListState createState() => _DisplayListState();
}
class _DisplayListState extends State<DisplayList> {
  @override
  Widget build(BuildContext context) {
    Map rdata = {};
    List digrees = [];
    double _value = 0;
    var widthView = MediaQuery.of(context).size.width;
    Future<List> fetchDigrees() async {
      Map rdata = ModalRoute.of(context).settings.arguments;
      int cm_id = int.parse(rdata['current_m_id'].toString());
      int d_id = int.parse(rdata['d_id'].toString());
      int w_id = int.parse(rdata['w_id'].toString());
      int u_id = int.parse(rdata['u_id'].toString());
      var url =
          'http://10.0.2.2/jiyan/test/api/digrees/day_digree.php?u_id=$u_id&m_id=$cm_id&d_id=$d_id';
      var response = await http.get(url);
      var data = jsonDecode(response.body);
      for (var x in data) {
        Digree newdigree = Digree(
            x['index'],
            x['title_k'],
            x['title_a'],
            x['aya'],
            x['link'],
            x['activity_k'],
            x['activity_a'],
            x['udigree']);
        digrees.add(newdigree);
      }
      print(digrees.length);
      print(data);
      return digrees;
    }
    return FutureBuilder(
      future: fetchDigrees(),
      builder: (context, snapshot) {
        List digrees = snapshot.data;
        if (snapshot.data == null) {
          return Center(
            child: Text("Loading"),
          );
        } else {
          return ListView.builder(
              itemCount: snapshot.data.length,
              itemBuilder: (BuildContext context, int index) {
                return Directionality(
                  textDirection: TextDirection.rtl,
                  child: Column(
                    children: <Widget>[
                      Container(
                        decoration: BoxDecoration(
                            borderRadius: BorderRadius.circular(15),
                            border: Border.all(width: 2, color: Colors.white),
                            color: Color.fromRGBO(230, 200, 200, 0.2)),
                        width: widthView,
                        padding: EdgeInsets.all(25),
                        margin: EdgeInsets.all(25),
                        child: Column(
                          children: <Widget>[
                            Text(
                              snapshot.data[index].activity_k,
                              textAlign: TextAlign.justify,
                              style:
                                  TextStyle(fontSize: 32, color: Colors.white),
                            ),
                            SliderTheme(
                              data: SliderTheme.of(context).copyWith(
                                activeTrackColor: Colors.red[700],
                                inactiveTrackColor: Colors.red[100],
                                trackShape: RectangularSliderTrackShape(),
                                trackHeight: 4.0,
                                thumbColor: Colors.redAccent,
                                thumbShape: RoundSliderThumbShape(
                                    enabledThumbRadius: 12.0),
                                overlayColor: Colors.red.withAlpha(32),
                                overlayShape: RoundSliderOverlayShape(
                                    overlayRadius: 28.0),
                              ),
                              child: Slider(
                                value: 0,
                                min: 0,
                                max: 100,
                                divisions: 10,
                                label: '$_value',
                                onChanged: null,
                              ),),],),),],),);});}},);}}

显示页面:

import 'package:flutter/material.dart';
import 'package:jiyanUquraan/components/daylist.dart';
class Days extends StatefulWidget {
  @override
  _DaysState createState() => _DaysState();
}
class _DaysState extends State<Days> {
  var cm_id;
  var d_id;
  var w_id;
  var u_id;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.pink[900],
        title: Text(
          'ژیان و قورئان',
          style: TextStyle(fontSize: 30),
        ),
        centerTitle: true,
      ),
      body: Container(
          decoration: BoxDecoration(
            image: DecorationImage(
              image: AssetImage("assets/images/background.png"),
              fit: BoxFit.cover,
            ),
          ),
          child: DisplayList()),      
    );
  }
}

【问题讨论】:

  • 什么问题,你试过了吗?
  • 我用列表视图构建器制作了未来的构建器,并且我正确地查看了行,但我无法显示标题和描述
  • 向我们展示代码,我们会为您提供更好的帮助。代码中的问题我会特别指出,帮助你正确获取视图
  • 好的,我将编辑问题并添加代码
  • 太好了,等着。只需添加负责显示数据的FutureBuilder()即可。

标签: flutter listview dart


【解决方案1】:

答案 3.0

所以,据我正确理解情况,title_kaya 需要调用一次,然后Directionality()Column() 构建。它将根据snapshot.data 列表包装您的Directionality

ListView(
  shrinkWrap: true,
  children: [
    Text('title_k'),
    Text('aya'),
    Column(
       children: snapshot.data.map<Widget>((e) => Directionality(...)).toList()
    )
  ]
)

请注意:您必须将Directionality中的数据作为e.key_of_digree_model获取。 e 可以是任何东西,随便你怎么形容map((item))

例如: Text(snapshot.data[index].activity_k) 将仅在 Directionality 中变为 Text(item.activity_k)

现在我们将编写普通代码,它会给你答案。具体来说,您的答案仅限于DisplayList()。因此,将其发布为答案

假设:我可以看到您的title_kaya 对于每个Digree Model 都是相同的,所以我只会从index = 0 中获取title_kaya只要。像这样

// title
Text(snapshot.data[0].title_k)

//Description
Text(snapshot.data[0].aya)

DisplayList()

//specific code only, since Column() has all the data required
// inside your else of FutureBuilder
return Container(
  height: MediaQuery.of(context).size.height,
  width: MediaQuery.of(context).size.width,
  child: ListView(
     shrinkWrap: true,
     children: [
        //title
        Text(snapshot.data[0].title_k),
        //for top margin
        SizedBox(height: 20.0),
        // dexription
        Text(snapshot.data[0].aya),
        //for top margin
        SizedBox(height: 20.0),

        // your Directionality
        Column(
           mainAxisAlignment: MainAxisAlignment.center,
           crossAxisAlignment: CrossAxisAlignment.stretch,
           children: snapshot.data.map<Widget>((item){
               // for example snapshot.data[index].activity_k will become
               // item.activity_k
               return Directionality(....);
           }).toList()
        )
     ]
  )
);

请阅读Mapping a list item StackoverFlow

【讨论】:

  • 非常感谢,它工作正常,这是我正在开发的第一个应用程序,我会从中学到很多东西,将来我可能还有其他问题,最好的问候
  • 我喜欢你的作品@SermedBerwari 你的设计太棒了。作为首发,你做得很好。一切顺利,我的朋友。 :)
  • 但是在所有行之前查看的标题和描述仍然有问题,我只想显示第一行的顶部
  • 您不希望每个Directionality() @SermedBerwari 都有titleaya 吗?
  • 你能在这里分享最新结果的截图吗@SermedBerwari?
猜你喜欢
  • 2023-02-18
  • 2023-03-29
  • 2018-10-27
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 2015-04-21
相关资源
最近更新 更多