Flutter14.Card

本文介绍了一个使用Flutter框架创建卡片样式的实例,展示了如何利用Dart语言和Flutter的Widget组件构建美观的UI界面,包括图片、标题、描述和交互元素。

ex:

import 'dart:math';

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'CardApp',
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Card Example'),
        leading: Icon(Icons.payment),
      ),
      body: ListView(
        children: <Widget>[
          buildCard(),
          buildCard(),
          buildCard(),
        ],
      ),
    );
  }

  Card buildCard() {
    return Card(
          child: Column(
            children: <Widget>[
              Container(
                child : Image.asset(
                  'assets/images/bg1.png',
                  width: double.infinity,//double.infinity是原高度
                  height: 150.0,
                  fit: BoxFit.cover,//BoxFit.fill是平铺,BoxFit.cover展示固定区域内容
                ),
              ),
              Row(
                children: <Widget>[
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Icon(Icons.home),
                  ),
                  Expanded(
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: <Widget>[
                        Text(
                          'Main Content Tiltle',
                          style: TextStyle(fontSize: 22.0),
                        ),
                        Text(
                          'describe',
                          style: TextStyle(fontSize: 14.0),
                        ),
                      ],
                    ),
                  ),
                  Container(//点赞的图标
                    child: Column(
                      children: <Widget>[
                        Icon(
                          Icons.favorite,
                          color: Color(0xffff0000),
                        ),
                        Text('99'),
                      ],
                    ),
                  ),
                ],
              )
            ],
          ),
        );
  }
}

输出:

Flutter 中使用 `MasonryGridView.count` 实现上拉加载动画,可以结合 `MasonryGridView` 的懒加载特性以及滚动监听机制来实现。`MasonryGridView.count` 是 `flutter_staggered_grid_view` 包中的一个组件,它支持构建瀑布流布局,并且可以配合 `ScrollController` 来监听滚动事件,从而实现上拉加载更多数据的动画效果。 为了实现上拉加载动画,可以按照以下步骤进行: 1. **引入依赖**:首先确保在 `pubspec.yaml` 中引入了 `flutter_staggered_grid_view` 包[^1]: ```yaml dependencies: flutter: sdk: flutter flutter_staggered_grid_view: ^0.6.2 ``` 2. **构建基础的 `MasonryGridView.count` 布局**: ```dart MasonryGridView.count( controller: _scrollController, crossAxisCount: 2, mainAxisSpacing: 4, crossAxisSpacing: 4, itemCount: items.length, itemBuilder: (context, index) { return YourItemWidget(items[index]); }, ) ``` 3. **添加滚动监听器**:通过 `ScrollController` 监听滚动事件,判断是否接近底部,从而触发加载更多数据的逻辑: ```dart void _scrollListener() { if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) { _loadMore(); } } void _loadMore() { if (_isLoading) return; setState(() { _isLoading = true; }); // 模拟网络请求 Future.delayed(Duration(seconds: 2), () { setState(() { // 添加更多数据 items.addAll(List.generate(10, (index) => 'Item ${items.length + index}')); _isLoading = false; }); }); } ``` 4. **添加加载动画**:可以在底部添加一个显示加载状态的组件,例如一个 `CircularProgressIndicator`,当 `_isLoading` 为 `true` 时显示该组件: ```dart if (_isLoading) Center( child: CircularProgressIndicator(), ) ``` 5. **完整示例代码**: ```dart class MasonryGridWithLoadMore extends StatefulWidget { @override _MasonryGridWithLoadMoreState createState() => _MasonryGridWithLoadMoreState(); } class _MasonryGridWithLoadMoreState extends State<MasonryGridWithLoadMore> { late ScrollController _scrollController; List<String> items = List.generate(20, (index) => 'Item $index'); bool _isLoading = false; @override void initState() { super.initState(); _scrollController = ScrollController(); _scrollController.addListener(_scrollListener); } @override void dispose() { _scrollController.removeListener(_scrollListener); _scrollController.dispose(); super.dispose(); } void _scrollListener() { if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) { _loadMore(); } } void _loadMore() { if (_isLoading) return; setState(() { _isLoading = true; }); // 模拟网络请求 Future.delayed(Duration(seconds: 2), () { setState(() { // 添加更多数据 items.addAll(List.generate(10, (index) => 'Item ${items.length + index}')); _isLoading = false; }); }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('MasonryGridView with Load More')), body: Column( children: [ Expanded( child: MasonryGridView.count( controller: _scrollController, crossAxisCount: 2, mainAxisSpacing: 4, crossAxisSpacing: 4, itemCount: items.length, itemBuilder: (context, index) { return Card( child: Center(child: Text(items[index])), ); }, ), ), if (_isLoading) Padding( padding: const EdgeInsets.all(8.0), child: Center(child: CircularProgressIndicator()), ), ], ), ); } } ``` 通过上述方法,可以实现在 `MasonryGridView.count` 中的上拉加载动画。此方法利用了 `ScrollController` 来监听滚动事件,并在接近底部时触发加载更多数据的逻辑,同时通过一个加载指示器来提供用户反馈[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值