簡體   English   中英

Flutter:tinder 喜歡沒有堆棧的卡片

[英]Flutter: tinder likes cards without a stack

我正在開發一個語言學習測驗應用程序。 該人選擇一個主題(30 個單詞),我通過 API 向服務器發出請求,以獲取翻譯和轉錄列表。

因為獲取數據需要很長時間,所以我只想獲取幾個單詞的數據。 第一張卡片已顯示,第二張卡片已加載。 當用戶使用第一個(滑動它)時,第二個出現,第三個的數據並行加載。

你怎么能得到這樣的數據? 所有 tinder-cards 小部件都請求一個 stack ,即已經准備好的數據。 就我而言,這是不允許的。

我假設它應該是這樣的:顯示不是堆棧而是只顯示一張卡片這個

帶有堆棧的 Ui 很好,您需要使用FutureListsetState對獲取數據邏輯做一些處理。

示例:當我滑動時,頂部數據 object 被滑動,最后創建新數據 object(完成后開始獲取和 seft setState)。

import 'package:flutter/material.dart';
import 'dart:math';

void main() => runApp(MaterialApp(home: MyApp()));

class MyApp extends StatefulWidget {
  final int cardSizes = 3;

  @override
  MyAppState createState() => MyAppState();
}

class MyAppState extends State<MyApp> {
  var datas = <AGirl>[];

  @override
  void initState() {
    // generate stack when init
    datas = List.generate(widget.cardSizes, (_) => getNewGirl());
  }

  // function that return a AGirl and register a `setState` when data fetched
  AGirl getNewGirl() => AGirl()..fetch().then((_) => setState(() {}));

  // function that `swipe` top data object and add new unfetched data object at the last
  void swipe() {
    datas.removeAt(0);
    datas.add(getNewGirl());
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: renderCards(),
      ),
    );
  }

  List<Widget> renderCards() {
    render(AGirl data, int index) {
      return Positioned(
        left: index * 200,
        child: SizedBox(
          width: 200,
          height: 300,
          child: Card(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: [
                Text('Card $index'),
                Text('AGirl id ${data.id}'),
                data.hasData
                    ? const Center(child: Text('loaded'))
                    : const CircularProgressIndicator(),
                ElevatedButton(
                  onPressed: index == 0 ? swipe : null,
                  child: const Text('swipe'),
                ),
              ],
            ),
          ),
        ),
      );
    }

    return datas.reversed
        .map((data) => render(data, datas.indexOf(data)))
        .toList();
  }
}

class AGirl {
  final int id;
  dynamic data;
  AGirl() : id = Random().nextInt(99999);
  bool get hasData => data != null;

  Future<AGirl> fetch() async {
    await Future.delayed(const Duration(milliseconds: 1000));
    data = {};
    return this;
  }
}

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM