【问题标题】:Flutter Riverpod : how to use consumer widget in sliversFlutter Riverpod:如何在 slivers 中使用消费者小部件
【发布时间】:2021-10-14 19:50:03
【问题描述】:
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CustomScrollView(
        slivers: <Widget>[
          const SliverToBoxAdapter(),
          Consumer(
            builder: (context, watch, child) {
              return watch(recordProvider).when(
                data: (records) {
                  // how to returns a set of Weigets(SliverPersistentHeader and SliverList) based on each item of records, 
                }, 
                loading: () => const SliverToBoxAdapter(),
                error: (obj, error) => const SliverToBoxAdapter(),
              );
            },
          ),
          const SliverToBoxAdapter(),
        ],
      ),
    );
  }
}

我是 Flutter 新手,想知道如何根据 List 中的每一项记录返回一组 Weigets(SliverPersistentHeader 和 SliverList)?谢谢!

【问题讨论】:

    标签: flutter riverpod


    【解决方案1】:

    您好,欢迎来到 Flutter。 Slivers 比使用其他更高级别的小部件要复杂得多,所以我在这个答案上是裸露的。该代码记录了正在发生的事情,它使用一个非常原始的数据列表来构建CustomScrollView,只是一个List&lt;int&gt;

    /// fake FutureProvider
    final recordProvider = FutureProvider(
      (ref) => Future.value(
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
      ),
    );
    
    /// Our page of records
    class RecordPage extends StatelessWidget {
      const RecordPage({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Consumer(
            builder: (context, watch, child) {
              /// Building a list of our slivers up front so that it's easier to read
              final List<Widget> slivers = watch(recordProvider).when(
                data: (records) {
                  /// Lets split up some data so we can have our persistent headers hold some lists
                  final even = records.where((element) => element & 1 == 0);
                  final odd = records.where((element) => element & 1 == 1);
    
                  /// Now we need to take that data and make some lists of widgets
                  final evenWidgets =
                      even.map((e) => RecordWidget(record: e)).toList();
                  final oddWidgets =
                      odd.map((e) => RecordWidget(record: e)).toList();
    
                  /// Now let's make some SliverLists
                  final evenSliverList = SliverList(
                    delegate: SliverChildListDelegate.fixed(evenWidgets),
                  );
                  final oddSliverList = SliverList(
                    delegate: SliverChildListDelegate.fixed(oddWidgets),
                  );
    
                  /// Now let's create some headers
                  const evenHeader = SliverPersistentHeader(
                    delegate: RecordPersistentHeader('Even'),
                  );
    
                  const oddHeader = SliverPersistentHeader(
                    delegate: RecordPersistentHeader('Odd'),
                  );
    
                  /// Now let's merge them all together and return the slivers
                  return [
                    evenHeader,
                    evenSliverList,
                    oddHeader,
                    oddSliverList,
                  ];
                },
                loading: () => [const SliverToBoxAdapter()],
                error: (obj, error) => [const SliverToBoxAdapter()],
              );
    
              /// Finally let's return our [CustomScrollView] with our list of slivers
              return CustomScrollView(
                slivers: slivers,
              );
            },
          ),
        );
      }
    }
    
    /// The contents of our record sliver
    class RecordWidget extends StatelessWidget {
      const RecordWidget({Key? key, required this.record}) : super(key: key);
    
      final int record;
    
      @override
      Widget build(BuildContext context) {
        return Text('$record');
      }
    }
    
    /// The contents of our header sliver
    class RecordPersistentHeader extends SliverPersistentHeaderDelegate {
      const RecordPersistentHeader(this.title);
    
      final String title;
    
      @override
      Widget build(
          BuildContext context, double shrinkOffset, bool overlapsContent) {
        return Text(title);
      }
    
      @override
      double get maxExtent => 40;
    
      @override
      double get minExtent => 40;
    
      @override
      bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) {
        return false;
      }
    }
    

    【讨论】:

    • 这一行出现错误:element & 1 == 0 如何解决,谢谢!
    • 呃,什么错误?
    • 您的数据源不会是一个整数列表...这只是一个用于演示目的的假数据源...您需要根据需要填写该数据方法。
    • 您的数据源很可能是一个模型列表。您将需要一个采用该模型并进行可视化表示的小部件。头部委托的头部也是如此。
    • 对不起,我的英语不够好。没关系,问题已经解决了,你帮了我大忙!谢谢 !祝你有美好的一天!
    猜你喜欢
    • 2020-05-10
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2021-06-24
    相关资源
    最近更新 更多