Flutter for window 实现excel效果进行展示数据

130 阅读1分钟

实现效果图

image.png

主要实现的功能

1.当上下滑动时冻结首行

image.png

1.当左右拖拽滚动条滑动时冻结第一列和最后一列

image.png

实现鼠标滚轮上下滑动,和左右拖拽滚动条滑动

image.png

主要思路

1.分块;
2.使用ListVeiw
3.使用linked_scroll_controller: ^0.2.0插件进行多个listview进行组合滑动
4.项目工程中隐藏滚动条,只在此界面中使用Scrollbar组件进行显示(要不然每一个listView都会出现滚动条)

主要代码

import 'package:flutter/material.dart';
import 'package:ui_state/state_widget.dart';
import '../../../../system/kit.dart';
import 'logic.dart';

class StudentInformationPage extends StatelessWidget {
  const StudentInformationPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("学生信息采集"),
      ),
      body: kit.body(
        child: StateWidget(
          logic: StudentInformationLogic(context),
          builder: (logic) => Container(
            decoration: BoxDecoration(
                border: Border.all(width: .5, color: Colors.grey.shade500)),
            child: Row(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Column(
                  children: [
                    Container(
                      decoration: BoxDecoration(
                          border: Border.all(
                              width: .5, color: Colors.grey.shade500)),
                      height: 90,
                      width: 100,
                      child: const Center(
                        child: Text("姓名"),
                      ),
                    ),
                    Expanded(
                      child: SizedBox(
                        width: 100,
                        child: ListView.builder(
                          controller: logic.scrollController1,
                          itemCount: logic.state.leftList.length,
                          itemExtent: 30,
                          itemBuilder: (context, index) {
                            LeftItem item = logic.state.leftList[index];
                            return Container(
                              width: 100,
                              decoration: BoxDecoration(
                                  border: Border.all(
                                      width: .5, color: Colors.grey.shade500)),
                              child: Center(
                                child: Text(item.title),
                              ),
                            );
                          },
                        ),
                      ),
                    ),
                  ],
                ),
                Expanded(
                  child: Column(
                    children: [
                      SizedBox(
                        height: 90,
                        child: ListView.builder(
                          controller: logic.scrollController4,
                          scrollDirection: Axis.horizontal,
                          itemExtent: 150,
                          itemBuilder: (context, index) {
                            TopItem topItem = logic.state.topList[index];
                            return Container(
                              decoration: BoxDecoration(
                                  border: Border.all(
                                      width: .5,
                                      color: Colors.grey.shade500)),
                              width: 150,
                              height: 90,
                              child: Column(
                                children: [
                                  Text(topItem.title),
                                  Text(topItem.subTitle),
                                  Text(topItem.import),
                                ],
                              ),
                            );
                          },
                          itemCount: logic.state.topList.length,
                        ),
                      ),
                      Expanded(
                        child: SingleChildScrollView(
                          controller: logic.scrollController3,
                          scrollDirection: Axis.vertical,
                          child: SizedBox(
                            height: 1500,
                            child: ListView.builder(
                              controller: logic.scrollController5,
                              itemCount: logic.state.courseList.length,
                              scrollDirection: Axis.horizontal,
                              itemBuilder: (context, index) {
                                CourseItem item = logic.state.courseList[index];
                                return Column(
                                    children: List.generate(
                                  item.value.length,
                                  (indexT) => Container(
                                    width: 150,
                                    height: 30,
                                    decoration: BoxDecoration(
                                        border: Border.all(
                                            width: .5,
                                            color: Colors.grey.shade500)),
                                    child: Center(
                                      child: Text("${item.value[indexT]}分"),
                                    ),
                                  ),
                                ));
                              },
                            ),
                          ),
                        ),
                      ),
                      SizedBox(
                        height: 10,
                        child: Scrollbar(
                          thumbVisibility: true,
                          scrollbarOrientation: ScrollbarOrientation.bottom,
                          controller: logic.scrollController6,
                          child: ListView.builder(
                            controller: logic.scrollController6,
                            scrollDirection: Axis.horizontal,
                            itemExtent: 150,
                            itemBuilder: (context, index) {
                              return Container();
                            },
                            itemCount: logic.state.topList.length,
                          ),
                        ),
                      ),
                    ],
                  ),
                ),
                Column(
                  children: [
                    GestureDetector(
                      onTap:logic.addSomeData,
                      child: Container(
                        height: 90,
                        width: 100,
                        decoration: BoxDecoration(
                            border: Border.all(
                                width: .5, color: Colors.grey.shade500)),
                        child: const Center(
                          child: Text("操作"),
                        ),
                      ),
                    ),
                    Expanded(
                      child: SizedBox(
                        width: 100,
                        child: Scrollbar(
                          thumbVisibility: true,
                          controller: logic.scrollController2,
                          child: ListView.builder(
                            itemCount: logic.state.rightList.length,
                            controller: logic.scrollController2,
                            itemExtent: 30,
                            itemBuilder: (context, index) {
                              RightItem item = logic.state.rightList[index];
                              return Container(
                                decoration: BoxDecoration(
                                    border: Border.all(
                                        width: .5,
                                        color: Colors.grey.shade500)),
                                width: 100,
                                child: Center(
                                  child: Text(item.title),
                                ),
                              );
                            },
                          ),
                        ),
                      ),
                    ),
                  ],
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}