Flutter2.0列表局部刷新

import 'package:fluro/fluro.dart';
import 'package:flutter/material.dart';
import 'package:flutter_app_frame/test_bean.dart';


void main() async{
  runApp(MyApp());

}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {

    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: TestListPartPage(),
    );
  }
}
///ListView 局部数据更新使用 Demo
class TestListPartPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _TestABPageState();
  }
}
class _TestABPageState extends State {
  ///测试数据集合
  List<TestBean> _testList = [];

  @override
  void initState() {
    super.initState();
    ///模拟测试数据
    for (int i = 0; i < 100; i++) {
      _testList.add(TestBean(name: "测试数据 $i", isCollect: false));
    }
  }

  @override
  Widget build(BuildContext context) {
    ///页面主体脚手架
     print('TestABPageState');
    return Scaffold(
      appBar: AppBar(
        title: Text("ListView 局部数据更新 "),
      ),
      body: buildListView(),
    );
  }

  ///构建一个列表 ListView
  buildListView() {
    ///懒加载模式构建
    return ListView.builder(
      ///子Item的构建器
      itemBuilder: (BuildContext context, int index) {
        ///每个子Item的布局
        ///在这里是封装到了独立的 StatefulWidget
        print('buildListView');
        return TestListItemWidget(
          ///子Item对应的数据
          bean: _testList[index],
          ///可选参数 子Item标识
        );
      },
      ///ListView子Item的个数
      itemCount: _testList.length,
    );
  }
}
///ListView 的子Item
class TestListItemWidget extends StatefulWidget {
  ///本Item对应的数据模型
  final TestBean bean;

  TestListItemWidget({required this.bean});

  @override
  State<StatefulWidget> createState() {
    return _ListItemState();
  }
}
class _ListItemState extends State<TestListItemWidget> {
  @override
  Widget build(BuildContext context) {
    print('ListItemState');
    return Material(
      child: Container(
        color: Colors.grey[300],
        padding: EdgeInsets.only(
          top: 5,
          bottom: 5,
        ),
        child: Container(
          padding: EdgeInsets.only(
            left: 15,
            right: 15,
          ),
          color: Colors.white,
          height: 60,
          child: buildRow(),
        ),
      ),
    );
  }

  ///内容区域
  Row buildRow() {
    ///左右线性排开
    print('buildRow');
    return Row(
      children: [
        ///权重布局 文本占用空白区域
        Expanded(
            child: Text(
              "${widget.bean.name}",
            )),
        ///收藏按钮
        RaisedButton(
          ///按钮的背景
          color: widget.bean.isCollect! ? Colors.blue : Colors.grey[200],
          ///点击更新当前 Item 数据以及刷新页面显示
          onPressed: () {
            setState(() {
              widget.bean.isCollect =! widget.bean.isCollect!;
            });
          },
          child: Text(
            "${widget.bean.isCollect! ? '已收藏' : '收藏'}",
            style: TextStyle(
                color: widget.bean.isCollect! ? Colors.white : Colors.red),
          ),
        ),
      ],
    );
  }
}




Flutter中,局部刷新可以通过以下两种方式实现: 1. **使用Provider**[^1] Provider是Flutter的一个状态管理库,它允许你将状态分发到应用程序的各个部分。当你需要更新特定部分的UI时,只需调用`Consumer` widget并提供一个变更通知的方法,如`notifyListeners()`,这将会使得仅依赖该状态的组件重新构建。 ```dart import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; // 创建一个Provider并提供一个变更方法 class MyProvider with ChangeNotifier { // 假设这是你的状态 int count = 0; void increment() { count++; notifyListeners(); } } // 在Consumer中监听并响应变更 class LocalRefreshWithProvider extends StatelessWidget { @override Widget build(BuildContext context) { return Consumer<MyProvider>( builder: (context, provider, child) { return Text('Count: ${provider.count}'); // 当count变化时,这里会自动更新 }, ); } } ``` 2. **使用StreamBuilder** StreamBuilder监听流(stream)的变化,当流中的数据有新的更新时,会自动触发组件的重建,从而实现局部刷新。这对于实时数据更新非常有用,比如网络请求返回的数据。 ```dart class LocalRefreshWithStreamBuilder extends StatelessWidget { final StreamController<int> controller = StreamController<int>.broadcast(); @override Widget build(BuildContext context) { return StreamBuilder<int>( stream: controller.stream, builder: (context, snapshot) { if (snapshot.hasData) { return Text('Count: $snapshot.data'); } else { return CircularProgressIndicator(); } }, // 更新数据时调用此方法 onChanged: (value) { controller.add(value); }, ); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值