flutter开发实战-类似微博帖子列表及下拉刷新上拉加载效果

flutter开发实战-类似微博帖子列表及下拉刷新上拉加载效果

在之前处理类似微博帖子列表及下拉刷新上拉加载效果,刷新使用的是EasyRefresh

一、引入EasyRefresh与likeButton

在工程的pubspec.yaml中引入插件

    # 下拉刷新、上拉更多
  easy_refresh: ^3.3.2+1
  pull_to_refresh: ^2.0.0
    

需要使用EasyRefreshController来控制处理刷新,初始化

@override
  void initState() {
    super.initState();
    _controller = EasyRefreshController(
      controlFinishRefresh: true,
      controlFinishLoad: true,
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
    

需要在onRefresh与onLoad来处理下拉刷新上拉加载数据。

二、类似微博帖子列表及下拉刷新上拉加载效果

类似微博帖子列表,这里定义帖子item,每个帖子中可能包括多张图片。

NoteItem:

class NoteItem {
  String? feedId;
  String? coverImageUrl;
  String? title;
  String? textContent;
  String? username;
  String? avatarUrl;
  String? time;
  String? likeNum;
  bool? liked;
  String? categoryName;
  List<NoteImage>? images;
}

class NoteImage {
  String? imageUrl;
  String? imageWidth;
  String? imageHeight;
}
    

定义每个帖子的Widget:NoteListItemWidget,NoteListItemWidget结构是用户头像,描述文本,帖子图片,点赞、评论、分享栏。

NoteListItemWidget:

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_app_demolab/display/note_item.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:like_button/like_button.dart';

class NoteListItemWidget extends StatefulWidget {
  NoteListItemWidget({
    super.key,
    required this.noteItem,
  });

  final NoteItem noteItem;

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

class _NoteListItemWidgetState extends State<NoteListItemWidget> {
  @override
  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.symmetric(vertical: 5.0, horizontal: 0.0),
      padding: EdgeInsets.symmetric(vertical: 5.0, horizontal: 15.0),
      //边框设置
      decoration: new BoxDecoration(
        //背景
        color: Color(0xFFFFFFFF),
        //设置四周圆角 角度 这里的角度应该为 父Container height 的一半
        borderRadius: BorderRadius.only(
            topLeft: Radius.circular(10.0), topRight: Radius.circular(10.0)),
        //设置四周边框
        border: new Border.all(width: 1, color: Color(0xFFf1f1f1)),
      ),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.start,
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          NoteListAuthorBar(
              username: widget.noteItem.username,
              avatarUrl: widget.noteItem.avatarUrl,
              showTime: widget.noteItem.time
          ),
          Text(
            widget.noteItem.textContent??"",
            maxLines: 5,
            overflow: TextOverflow.ellipsis,
            style: TextStyle(
              fontSize: 14,
              fontWeight: FontWeight.normal,
              color: Color(0xFF666666),
            ),
          ),
          NoteListImage(images: (widget.noteItem.images != null
              ? widget.noteItem.images
              : [])),
          NoteListBottom(
              liked: widget.noteItem.liked,
              likeNum: widget.noteItem.likeNum,
              categoryName: widget.noteItem.categoryName
          ),
        ],
      ),
    );
  }
}

// 顶部header
class NoteListAuthorBar extends StatelessWidget {
  const NoteListAuthorBar({
    super.key,
    this.username,
    this.avatarUrl,
    this.showTime,
  });

  final String? username;
  final String? avatarUrl;
  final String? showTime;

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.only(bottom: 10),
      height: 60,
      child: Row(
        mainAxisAlignment: MainAxisAlignment.start,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          CircleAvatar(
            backgroundImage: NetworkImage(avatarUrl ?? ""),
          ),
          Padding(
            padding: EdgeInsets.only(left: 10),
          ),
          Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(
                username ?? "",
                maxLines: 1,
                overflow: TextOverflow.ellipsis,
                style: TextStyle(
                  fontSize: 16,
                  fontWeight: FontWeight.bold,
                  color: Color(0xFF444444),
                ),
              ),
              Padding(
                padding: EdgeInsets.only(top: 5),
              ),
              Text(
                showTime ?? "",
                maxLines: 1,
                overflow: TextOverflow.ellipsis,
                style: TextStyle(
                  fontSize: 12,
                  fontWeight: FontWeight.normal,
                  color: Color(0xFF444444),
                ),
              ),
            ],
          )
        ],
      ),
    );
  }
}

// 显示图片
class NoteListImage extends StatelessWidget {
  const NoteListImage({
    super.key,
    this.images,
  });

  final List<NoteImage>? images;

  Widget layoutOfImages(List images, BuildContext context) {
    double screenWidth = MediaQuery
        .of(context)
        .size
        .width;
    double containW = screenWidth - 30;
    if (images.length == 1) {
      NoteImage noteImage = images[0];
      double imgWidth = 0;
      double imgHeight = 0;
      if (noteImage.imageWidth != null &&
          noteImage.imageWidth!.isNotEmpty &&
          noteImage.imageHeight != null &&
          noteImage.imageHeight!.isNotEmpty) {
        imgWidth = double.parse(noteImage.imageWidth!);
        imgHeight = double.parse(noteImage.imageHeight!);
        if (imgWidth > 0 && imgHeight > 0) {
          if (imgWidth < 1.0 && imgHeight < 1.0) {
            double maxLen = containW / 2.0;
            double showW = maxLen;
            double showH = maxLen;
            return Container(
              height: showH,
              width: showW,
              child: CachedNetworkImage(
                imageUrl: noteImage.imageUrl ?? "",
                placeholder: (context, url) =>
                    Center(child: CupertinoActivityIndicator()),
                errorWidget: (context, url, error) => Icon(Icons.error),
                fit: BoxFit.cover,
              ),
            );
          } else {
            double imageScale = imgWidth / imgHeight;
            double len1_3 = (containW - 20) / 3.0;
            double maxLen = len1_3 * 2 + 10;
            double showW = 0;
            double showH = 0;

            if (imageScale > 1.0) {
              // 横图
              showW = maxLen;
              showH = showW / imageScale;
            } else {
              // 竖图
              showH = maxLen;
              showW = imageScale * showH;
            }

            return Container(
              height: showH,
              width: showW,
              child: CachedNetworkImage(
                imageUrl: noteImage.imageUrl??"",
                placeholder: (context, url) =>
                    Center(child: CupertinoActivityIndicator()),
                errorWidget: (context, url, error) => Icon(Icons.error),
                fit: BoxFit.cover,
              ),
            );
          }
        }
      }
    } else if (images.length >= 2) {
      double showImageW = 0;
      if (images.length == 2 || images.length == 4) {
        showImageW = (containW - 10) / 2.0;
      } else {
        showImageW = (containW - 20) / 3.0;
      }
      List<Widget> imageWidgets = [];

      for (int index = 0; index < images.length; index++) {
        NoteImage noteImage = images[index];
        Widget widget = Container(
            height: showImageW,
            width: showImageW,
            child: CachedNetworkImage(
              imageUrl: noteImage.imageUrl??"",
              placeholder: (context, url) =>
                  Center(child: CupertinoActivityIndicator()),
              errorWidget: (context, url, error) => Icon(Icons.error),
              fit: BoxFit.cover,
            )
        );
        imageWidgets.add(widget);
      }

      return Container(
        alignment: Alignment.center,
        width: containW,
        child: Wrap(
          spacing: 8.0,
          // 主轴(水平)方向间距
          runSpacing: 8.0,
          // 纵轴(垂直)方向间距
          alignment: WrapAlignment.start,
          //沿主轴方向居中
          crossAxisAlignment: WrapCrossAlignment.center,
          children: imageWidgets,
        ),
      );
    }

    return Container();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.symmetric(vertical: 10, horizontal: 0),
      child: layoutOfImages(this.images??[], context),
    );
  }
}

// 显示底部
class NoteListBottom extends StatelessWidget {
  const NoteListBottom({
    super.key,
    this.liked,
    this.likeNum,
    this.categoryName,
  });

  final bool? liked;
  final String? likeNum;
  final String? categoryName;

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 60,
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          Container(
            padding: EdgeInsets.symmetric(vertical: 5.0, horizontal: 10.0),
            //边框设置
            decoration: new BoxDecoration(
              //背景
              color: Color(0xFFFFFFFF),
              //设置四周圆角 角度 这里的角度应该为 父Container height 的一半
              borderRadius: BorderRadius.only(
                  topLeft: Radius.circular(10.0),
                  topRight: Radius.circular(10.0)),
              //设置四周边框
              border: new Border.all(width: 1, color: Color(0xFFf1f1f1)),
            ),
            child: Text(
              this.categoryName??"",
              maxLines: 1,
              overflow: TextOverflow.ellipsis,
              style: TextStyle(
                fontSize: 12,
                fontWeight: FontWeight.normal,
                color: Color(0xFF444444),
              ),
            ),
          ),
          Container(
            padding: EdgeInsets.symmetric(vertical: 5.0, horizontal: 10.0),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.end,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                LikeButton(
                  likeBuilder: (bool isLiked) {
                    return Icon(Icons.thumb_up,
                        color: (isLiked ? Colors.deepOrange : Color(
                            0xFFA9A9A9)));
                  },
                  likeCount: int.parse(this.likeNum??"0"),
                  isLiked: this.liked,
                ),
                TextButton(
                  child: Wrap(
                    // 可以通过设置两个基础组件的间距
                    alignment: WrapAlignment.center, //沿主轴方向居中
                    crossAxisAlignment: WrapCrossAlignment.center,
                    spacing: 5,
                    children: [
                      Icon(Icons.comment, color: Color(0xFFA9A9A9)),
                      Text("评论",
                          style:
                          TextStyle(fontSize: 12, color: Color(0xFF888888)))
                    ],
                  ),
                  onPressed: () {},
                ),
                TextButton(
                  child: Wrap(
                    // 可以通过设置两个基础组件的间距
                    alignment: WrapAlignment.center, //沿主轴方向居中
                    crossAxisAlignment: WrapCrossAlignment.center,
                    spacing: 5,
                    children: [
                      Icon(Icons.share, color: Color(0xFFA9A9A9)),
                      Text("分享",
                          style:
                          TextStyle(fontSize: 12, color: Color(0xFF888888)))
                    ],
                  ),
                  onPressed: () {},
                ),
              ],
            ),
          )
        ],
      ),
    );
  }
}

    

最后,我们在page中处理类似帖子列表DisplayPage

DisplayPage:

import 'dart:math';

import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';
import 'package:flutter_app_demolab/display/note_item.dart';
import 'package:flutter_app_demolab/display/note_item_widget.dart';

class DisplayPage extends StatefulWidget {
  const DisplayPage({super.key});

  @override
  State<DisplayPage> createState() => _DisplayPageState();
}

class _DisplayPageState extends State<DisplayPage> {
  int _count = 10;
  late EasyRefreshController _controller;

  bool isLoading = false;
  ScrollController scrollController = ScrollController();
  List<NoteItem> list = [];

  List<NoteImage> noteImages = [];

  String randomBit() {
    String scopeF = '0123456789'; //首位
    String result = '';
    result = scopeF[Random().nextInt(scopeF.length)];
    return result;
  }

  @override
  void initState() {
    initItems();
    super.initState();
    _controller = EasyRefreshController(
      controlFinishRefresh: true,
      controlFinishLoad: true,
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  void initItems() {
    for (int index = 0; index < 12; index++) {
      NoteImage model = NoteImage();
      noteImages.add(model);

      if (index == 0) {
        model.imageUrl =
        "https://c-ssl.duitang.com/uploads/blog/202010/11/20201011085349_R2CjU.thumb.1000_0.jpeg";
        model.imageWidth = "580";
        model.imageHeight = "880";
      } else if (index == 1) {
        model.imageUrl =
        "https://c-ssl.duitang.com/uploads/blog/202011/15/20201115080806_7ddba.thumb.1000_0.jpg";
        model.imageWidth = "580";
        model.imageHeight = "580";
      } else if (index == 2) {
        model.imageUrl =
        "https://c-ssl.duitang.com/uploads/blog/202011/15/20201115100436_7ffc6.thumb.1000_0.jpg";
        model.imageWidth = "580";
        model.imageHeight = "560";
      } else if (index == 3) {
        model.imageUrl =
        "https://c-ssl.duitang.com/uploads/item/202006/09/20200609232715_yvqkd.thumb.1000_0.jpg";
        model.imageWidth = "580";
        model.imageHeight = "380";
      } else if (index == 4) {
        model.imageUrl =
        "https://c-ssl.duitang.com/uploads/blog/202012/03/20201203144923_425bc.thumb.1000_0.jpg";
        model.imageWidth = "580";
        model.imageHeight = "430";
      } else if (index == 5) {
        model.imageUrl =
        "https://c-ssl.duitang.com/uploads/blog/202010/11/20201011085351_3d2cS.thumb.1000_0.jpeg";
        model.imageWidth = "580";
        model.imageHeight = "850";
      } else if (index == 6) {
        model.imageUrl =
        "https://c-ssl.duitang.com/uploads/blog/202009/28/20200928184639_sxrum.thumb.1000_0.jpeg";
        model.imageWidth = "580";
        model.imageHeight = "810";
      } else if (index == 7) {
        model.imageUrl =
        "https://c-ssl.duitang.com/uploads/blog/202012/03/20201203145208_55d8c.thumb.1000_0.jpg";
        model.imageWidth = "580";
        model.imageHeight = "430";
      } else if (index == 8) {
        model.imageUrl =
        "https://c-ssl.duitang.com/uploads/item/202006/09/20200609232715_pjsin.thumb.1000_0.jpg";
        model.imageWidth = "580";
        model.imageHeight = "860";
      } else if (index == 9) {
        model.imageUrl =
        "https://c-ssl.duitang.com/uploads/blog/202012/03/20201203144929_cd406.thumb.1000_0.jpg";
        model.imageWidth = "580";
        model.imageHeight = "450";
      } else if (index == 10) {
        model.imageUrl =
        "https://c-ssl.duitang.com/uploads/blog/202012/03/20201203144705_40405.thumb.1000_0.jpg";
        model.imageWidth = "580";
        model.imageHeight = "450";
      } else if (index == 11) {
        model.imageUrl =
        "https://c-ssl.duitang.com/uploads/blog/202012/03/20201203144708_d5287.thumb.1000_0.jpg";
        model.imageWidth = "580";
        model.imageHeight = "750";
      }
    }

    for (int index = 0; index < 20; index++) {
      NoteItem model = NoteItem();
      model.liked = false;
      list.add(model);

      if (index % 5 == 0) {
        model.username = "可可";
        model.avatarUrl =
        "https://c-ssl.duitang.com/uploads/item/202007/22/20200722212206_ifscm.thumb.1000_0.jpg";
        model.time = "08/01 13:51";
        model.textContent = "等轮到你讲话时再说,认真聆听对方的谈话,千万别打断对方讲话,耐心等着,轮到你时再讲。";
        model.likeNum = "861380";
        model.categoryName = "兽圈";
      } else if (index % 5 == 2) {
        model.username = "琪琪";
        model.avatarUrl =
        "https://c-ssl.duitang.com/uploads/item/202007/22/20200722212209_insvm.thumb.1000_0.png";
        model.time = "08/01 13:51";
        model.textContent = "记得有活动,在活动现场等你哦~";
        model.likeNum = "50999";
        model.categoryName = "娃圈";
      } else if (index % 5 == 4) {
        model.username = "悦悦";
        model.avatarUrl =
        "https://c-ssl.duitang.com/uploads/item/202007/19/20200719102754_jrcoe.thumb.1000_0.jpg";
        model.time = "08/01 13:51";
        model.textContent = "说一说你想要的形象模型,晒一晒你的喜欢";
        model.likeNum = "6150";
        model.categoryName = "Pia戏圈";
      } else {
        model.username = "爱丽多啦";
        model.avatarUrl =
        "https://c-ssl.duitang.com/uploads/item/202007/19/20200719102756_ihfku.thumb.1000_0.jpg";
        model.time = "08/01 13:51";
        model.textContent = "你永远不懂我喜欢的东西,555";
        model.likeNum = "1507";
        model.categoryName = "语c圈";
      }

      List<NoteImage> tmpImages = [];
      String randomf = randomBit();
      String randomt = randomBit();
      int f = int.parse(randomf);
      int t = int.parse(randomt);
      print("f:$f");
      print("t:$t");

      if (f < t) {
        tmpImages.addAll(noteImages.sublist(f, t));
      } else if (f > t) {
        tmpImages.addAll(noteImages.sublist(t, f));
      } else {
        tmpImages.addAll(noteImages.sublist(t, t+1));
      }
      model.images = tmpImages;
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('EasyRefresh'),
      ),
      body: EasyRefresh(
        controller: _controller,
        header: const ClassicHeader(),
        footer: const ClassicFooter(),
        onRefresh: () async {
          await Future.delayed(const Duration(seconds: 4));
          if (!mounted) {
            return;
          }
          list = [];
          initItems();
          setState(() {
            _count = 10;
          });
          _controller.finishRefresh();
          _controller.resetFooter();
        },
        onLoad: () async {
          await Future.delayed(const Duration(seconds: 4));
          if (!mounted) {
            return;
          }
          initItems();
          setState(() {
            _count += 5;
          });
          _controller.finishLoad(
              _count >= 200 ? IndicatorResult.noMore : IndicatorResult.success);
        },
        child: ListView.builder(
          itemBuilder: (context, index) {
            return NoteListItemWidget(noteItem: this.list[index]);
          },
          itemCount: this.list.length,
        ),
      ),
    );
  }
}
    

效果图如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、小结

flutter开发实战-类似微博帖子列表及下拉刷新上拉加载效果

学习记录,每天不停进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/661338.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL建库

删除数据库 新建数据库 右键-新建数据库 字符集选中utf8(支持中文) 修改字符集 右键--数据库的属性 将字符集支持的数量变少可以修改

算法的时间与空间复杂度

算法是指用来操作数据、解决程序问题的一种方法。对于同一问题&#xff0c;使用不同的算法&#xff0c;也许最终结果是一样的&#xff0c;但在过程中消耗的资源和时间却会有很大的区别。 那我们该如何去衡量不同算法之间的优劣呢&#xff1f;主要还是从算法所占用的【时间】和…

最新!2023年台湾10米DEM地形瓦片数据

上次更新谷歌倾斜摄影转换生成OSGB瓦片V1.1版本&#xff0c;使用该版本生产了台北、台中、桃园三个地方的倾斜摄影OSGB数据&#xff0c;在OSGB可视化软件中进行展示&#xff0c;可视化效果和加载效率俱佳。已经很久没更新地形瓦片数据&#xff0c;主要是热点地区的原始数据没有…

6.S081的Lab学习——Lab5: xv6 lazy page allocation

文章目录 前言一、Eliminate allocation from sbrk() (easy)解析&#xff1a; 二、Lazy allocation (moderate)解析&#xff1a; 三、Lazytests and Usertests (moderate)解析&#xff1a; 总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。打算尝试6.S081&#xff0…

HTTP Digest Access Authentication Schema

HTTP Digest Access Authentication Schema 背景介绍ChallengeResponse摘要计算流程总结参考 背景 本文内容大多基于网上其他参考文章及资料整理后所得&#xff0c;并非原创&#xff0c;目的是为了需要时方便查看。 介绍 HTTP Digest Access Authentication Schema&#xff…

STL库--stack

目录 stack的定义 stack容器内元素的访问 stack常用函数实例解析 stack的常见用途 stack的定义 其定义的写法和其他STL容器相同&#xff0c;typename可以任意基本类型或容器&#xff1a; stack<typename> name; stack容器内元素的访问 由于栈本身就是一种后进先出…

Java Class类简介

一、类图&#xff1a; 二、基本介绍&#xff1a; 1. Class也是类&#xff0c;因此也继承了Object类。 2. Class类的对象不是new出来的&#xff0c;是系统创建的。 类加载器ClassLoader有个方法LoadClass()&#xff0c;将某个类对应的Class对象生成在堆中。 通过调试可以发现&am…

代码随想录-Day23

669. 修剪二叉搜索树 方法一&#xff1a;递归 class Solution {public TreeNode trimBST(TreeNode root, int low, int high) {if (root null) {return null;}if (root.val < low) {return trimBST(root.right, low, high);} else if (root.val > high) {return trimBS…

python基础-数据结构-leetcode刷题必看-queue---队列-python的底层构建

文章目录 队列双端队列 deque底层存储deque接口1. __init__(self, iterable: Iterable[_T], maxlen: int | None None) -> None2. append(self, __x: _T) -> None3. appendleft(self, __x: _T) -> None4. copy(self) -> Self5. count(self, __x: _T) -> int6. …

GoFly框架快速新增接口/上手写代码

拿到一个新框架大家可能无从下手&#xff0c;因为你对框架设计思路、结构不了解&#xff0c;从而产生恐惧&#xff0c;所以我们框架是通过简单可视化界面安装&#xff0c;安装后即可看到效果&#xff0c;然后点击先点点看各个功能&#xff0c;看现有的功能是怎么写的&#xff0…

怎样清理Mac存储空间 苹果电脑内存不够用怎么办 苹果电脑内存满了怎么清理

在使用 Mac 电脑的过程中&#xff0c;用户经常会遇到磁盘空间不足的困扰&#xff0c;这时候就需要寻找有效的方法来清理苹果电脑内存了。 清理Mac存储空间可以通过多种方法进行&#xff0c;以确保你的Mac能够高效运行并释放宝贵的存储空间。以下是一些有效的清理和优化方法&am…

swift 自定义扫码功能

使用功能​​​​​​​ 1. 调用扫码功能&#xff08;扫描二维码/条形码、图片识别二维码/条形码、生成二维码/条形码&#xff09; 2. 自定义扫码界面UI&#xff08;继承式自定义修改样式&#xff0c;完全自定义调用封装组件&#xff09; 3. 生成二维码/条形码 源码地址&#x…

Parquet使用指南:一个超越CSV、提升数据处理效率的存储格式

前言 在大数据时代&#xff0c;数据存储和处理的效率越来越重要。同时&#xff0c;我们在工作中处理的数据也越来越多&#xff0c;从excel格式到csv格式&#xff0c;从文件文档传输到直接从数据库提取&#xff0c;数据单位也从K到M再到G。 当数据量达到了G以上&#xff0c;几…

串口通信问题排查总结

串口通信问题排查 排查原则&#xff1a; 软件从发送处理到接收处理&#xff0c;核查驱动、控制及发送接收数据是否正常。硬件从发送到接收&#xff0c;针对信号经过的各段&#xff0c;分段核对信号是否正常。示波器、逻辑分析仪。用万用表、示波器、逻辑分析仪等工具&#xf…

Hadoop3:MapReduce之简介、WordCount案例源码阅读、简单功能开发

一、概念 MapReduce是一个 分布式运算程序 的编程框架&#xff0c;是用户开发“基于 Hadoop的数据分析 应用”的核心框架。 MapReduce核心功能是将 用户编写的业务逻辑代码 和 自带默认组件 整合成一个完整的 分布式运算程序 &#xff0c;并发运行在一个 Hadoop集群上。 1、M…

【高频】redis快的原因

相关问题&#xff1a; 1.为什么Redis能够如此快速地进行数据存储和检索&#xff1f; 2.Redis作为内存数据库,其内存存储有什么优势吗? 3.Redis的网络模型有何特点,如何帮助提升性能? 一、问题回答 Redis使用了内存数据结构&#xff0c;例如字符串、哈希表、列表、集合、有…

pycharm中,出现SyntaxError: Non-ASCII character ‘\xe4‘ in file... 的问题以及解决方法

文章目录 一、问题描述二、解决方法 一、问题描述 在pycharm中&#xff0c;使用python中编写中文字符时&#xff0c;会提示如下错误信息&#xff1a; SyntaxError: Non-ASCII character \xe4 in file ...... on line 8, but no encoding declared; see http://python.org/dev…

TypeScript-初识

TypeScript 是具有类型语法的JavaScript&#xff0c;是一门强类型的编程语言 变量不能做随意类型赋值 好处&#xff1a; 1️⃣ 静态类型检查&#xff0c;提前发现代码错误 function arrToStr(arr: Array<string>){return arr.join() } arrToStr(123) // 类型“stri…

网页版应用授权的核心难点

Web应用的出现 随着数字化时代发展&#xff0c;越来越多的企业开始关注工业软件上云。这种趋势不仅满足了企业对于提高生产效率、降低运维成本的需求&#xff0c;还帮助企业更好地应对市场竞争、实现产业升级和智能制造。 在软件上云的过程中&#xff0c;会产生新产品形态和新…

2024 京麟ctf -MazeCodeV1

文章目录 检查代码思路一个字节的指令注意附上S1uM4i佬们的exp https://www.ctfiot.com/184181.html 检查 代码 __int64 __fastcall check_solve(char *a1) {__int64 result; // rax__int64 v2; // rax__int64 index_step; // rax__int64 v4; // rax__int64 v5; // rax__int64…