Flutter Provider 使用指南详解

news/2024/4/28 5:30:46/文章来源:https://blog.csdn.net/qq_21484461/article/details/136972555

介绍

在Flutter应用程序开发中,状态管理是一个至关重要的方面。随着应用程序的复杂性增加,有效地管理和共享状态变得至关重要。Flutter Provider是一个流行的状态管理解决方案,它提供了一种简单而强大的方式来管理Flutter应用程序中的状态。

在这里插入图片描述

什么是Flutter Provider?

Flutter Provider是Flutter社区中最受欢迎的状态管理解决方案之一。它是一个轻量级、易于使用的库,旨在帮助开发人员有效地管理应用程序中的状态。Provider允许您将数据模型暴露给整个应用程序,并在需要时轻松地访问和更新状态。它基于InheritedWidget构建,提供了一种简单而强大的方法来在Flutter应用程序中共享状态。

为什么选择使用Provider?

选择使用Provider有以下几个重要原因:

  1. 简单易用:Provider提供了一种简单的API,使得状态管理变得非常容易。无需引入复杂的概念或第三方库,您就可以轻松地在应用程序中管理状态。

  2. 性能优化:Provider基于InheritedWidget构建,这意味着它能够有效地管理状态的更新并在必要时进行重建。这种设计使得Provider在性能方面表现出色,能够处理大型应用程序中的状态管理需求。

  3. 灵活性:Provider提供了多种用于状态管理的API,包括Provider.of()、Consumer和Selector等。这些API可以根据您的需求选择使用,使得您能够根据具体情况灵活地管理状态。

  4. 社区支持:Provider是Flutter社区中最受欢迎的状态管理解决方案之一,拥有庞大的用户群体和活跃的社区支持。这意味着您可以轻松地找到关于Provider的教程、示例代码以及解决方案。

综上所述,Flutter Provider是一个简单、高效且功能强大的状态管理解决方案,适用于各种规模的Flutter应用程序。选择使用Provider能够帮助您更轻松地管理应用程序中的状态,并提高开发效率和代码质量。

Provider 的基本概念

在 Flutter 中,Provider 是一个用于状态管理的库,它提供了一种简单而强大的方法来在应用程序中共享状态。Provider 基于 InheritedWidget 构建,允许您在整个应用程序中传递数据模型,以便在需要时访问和更新状态。通过使用 Provider,您可以避免手动传递数据模型,使得状态管理变得更加简单和高效。

Provider 是什么?

Provider 是一个用于管理和共享状态的 Flutter 库。它基于 InheritedWidget 构建,允许您在应用程序中共享数据模型并监听其变化。通过使用 Provider,您可以轻松地在应用程序的不同部分之间传递数据,并在需要时更新状态。

Provider 的工作原理

Provider 的工作原理基于 Flutter 的 InheritedWidget 机制。它通过创建一个 InheritedWidget,将数据模型传递给整个应用程序的组件树。当数据模型发生变化时,Provider 会自动通知依赖它的组件,并触发重新构建。这种机制使得状态的管理和更新变得自动化和高效。

Provider 的核心组件

Provider 提供了几个核心组件,用于不同场景下的状态管理:

  1. Provider:最基本的 Provider 组件,用于将数据模型暴露给整个应用程序。

  2. ChangeNotifierProvider:用于管理实现了 ChangeNotifier 接口的数据模型,当数据发生变化时会自动通知依赖它的组件进行更新。

  3. ValueListenableProvider:用于管理实现了 ValueNotifier 接口的数据模型,当数据发生变化时会自动通知依赖它的组件进行更新。

  4. StreamProvider:用于管理数据流,并在数据流中有新值时通知依赖它的组件进行更新。

  5. FutureProvider:用于管理 Future,并在 Future 完成时通知依赖它的组件进行更新。

这些核心组件提供了不同的方式来管理和共享状态,使得您能够根据具体情况选择适合的方式来进行状态管理。

在 Flutter 项目中集成 Provider

在开始使用 Provider 进行状态管理之前,您需要将 Provider 集成到您的 Flutter 项目中。这包括添加依赖、创建数据模型以及在应用程序中注册 Provider。

添加依赖

首先,在您的 Flutter 项目的 pubspec.yaml 文件中添加 Provider 依赖:

dependencies:flutter:sdk: flutterprovider: ^5.0.0

然后运行 flutter pub get 命令以安装新的依赖项。

创建数据模型

接下来,创建您的数据模型。这是您想要在应用程序中共享和管理的状态的表示。数据模型可以是任何您想要的东西,比如用户信息、应用程序设置、购物车内容等等。通常,您可以通过创建一个类来定义您的数据模型,并添加一些状态和方法来管理这些状态。

例如,假设您正在创建一个购物车应用程序,您可以创建一个名为 Cart 的数据模型类:

import 'package:flutter/material.dart';class Cart extends ChangeNotifier {List<String> _items = [];List<String> get items => _items;void addItem(String item) {_items.add(item);notifyListeners(); // 通知依赖此数据模型的组件进行更新}void removeItem(String item) {_items.remove(item);notifyListeners(); // 通知依赖此数据模型的组件进行更新}
}

在应用程序中注册 Provider

最后,在您的应用程序的顶层 Widget 中注册 Provider,以便在整个应用程序中共享数据模型。通常,您可以在 main.dart 文件的 main() 函数中注册 Provider。

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'cart.dart'; // 导入您的数据模型类void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return ChangeNotifierProvider(create: (context) => Cart(), // 创建数据模型实例child: MaterialApp(title: 'My Shopping App',theme: ThemeData(primarySwatch: Colors.blue,),home: MyHomePage(),),);}
}class MyHomePage extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('My Shopping Cart'),),body: Center(child: Text('Welcome to my shopping app!'),),);}
}

在这个示例中,我们使用了 ChangeNotifierProvider 来注册我们的 Cart 数据模型,并将其作为整个应用程序的顶层 Provider。现在,您可以在任何地方访问和使用 Cart 数据模型,而无需手动传递它。

Provider 的使用方法

一旦您在 Flutter 项目中集成了 Provider,并创建了您的数据模型,您就可以开始使用 Provider 来管理和共享状态。Provider 提供了几种不同的方法来访问和更新状态,包括使用 Provider.of()ConsumerSelector 等。

使用 Provider.of()

Provider.of() 是 Provider 提供的最基本的方法之一,它允许您在组件树中直接访问数据模型。当数据模型发生变化时,依赖它的组件会自动进行更新。

final cart = Provider.of<Cart>(context);// 通过 Provider.of() 访问数据模型的状态
Text('${cart.items.length} items in cart')

使用 Consumer

Consumer 是一个 Widget,它允许您在需要访问数据模型的地方订阅状态,并在状态发生变化时重新构建子组件。使用 Consumer 可以减少不必要的重新构建,并提高性能。

Consumer<Cart>(builder: (context, cart, child) {return Text('${cart.items.length} items in cart');},
)

使用 Selector

Selector 类似于 Consumer,但它允许您选择订阅数据模型的特定部分,而不是整个数据模型。这可以提高性能,因为它只会在特定部分的状态发生变化时重新构建子组件。

Selector<Cart, int>(selector: (context, cart) => cart.items.length,builder: (context, itemsCount, child) {return Text('$itemsCount items in cart');},
)

通过这些方法,您可以根据具体情况选择合适的方式来访问和更新数据模型的状态。无论是直接访问状态、使用 Consumer 进行订阅还是使用 Selector 进行高效订阅,Provider 都提供了灵活的方法来管理状态,并使得状态管理变得更加简单和高效。

Provider 的使用方法

一旦您在 Flutter 项目中集成了 Provider,并创建了您的数据模型,您就可以开始使用 Provider 来管理和共享状态。Provider 提供了几种不同的方法来访问和更新状态,包括使用 Provider.of()ConsumerSelector 等。

使用 Provider.of()

Provider.of() 是 Provider 提供的最基本的方法之一,它允许您在组件树中直接访问数据模型。当数据模型发生变化时,依赖它的组件会自动进行更新。

final cart = Provider.of<Cart>(context);// 通过 Provider.of() 访问数据模型的状态
Text('${cart.items.length} items in cart')

使用 Consumer

Consumer 是一个 Widget,它允许您在需要访问数据模型的地方订阅状态,并在状态发生变化时重新构建子组件。使用 Consumer 可以减少不必要的重新构建,并提高性能。

Consumer<Cart>(builder: (context, cart, child) {return Text('${cart.items.length} items in cart');},
)

使用 Selector

Selector 类似于 Consumer,但它允许您选择订阅数据模型的特定部分,而不是整个数据模型。这可以提高性能,因为它只会在特定部分的状态发生变化时重新构建子组件。

Selector<Cart, int>(selector: (context, cart) => cart.items.length,builder: (context, itemsCount, child) {return Text('$itemsCount items in cart');},
)

通过这些方法,您可以根据具体情况选择合适的方式来访问和更新数据模型的状态。无论是直接访问状态、使用 Consumer 进行订阅还是使用 Selector 进行高效订阅,Provider 都提供了灵活的方法来管理状态,并使得状态管理变得更加简单和高效。

使用多个 Provider

在复杂的 Flutter 应用程序中,您可能需要管理多个不同类型的数据模型,并在整个应用程序中共享它们。Provider 允许您轻松地使用多个 Provider 来管理多个数据模型,并在需要时访问和更新它们。

嵌套 Provider

嵌套 Provider 是一种常见的模式,用于管理多个数据模型,并在应用程序的不同部分之间传递数据。您可以将多个 Provider 嵌套在一起,以便在更深层次的组件中访问它们。

return ChangeNotifierProvider(create: (context) => DataModel1(),child: ChangeNotifierProvider(create: (context) => DataModel2(),child: MyApp(),),
);

在这个示例中,我们嵌套了两个 Provider:DataModel1DataModel2。这样,我们就可以在整个应用程序中访问这两个数据模型。

ProxyProvider

有时,一个数据模型的创建可能依赖于另一个数据模型。在这种情况下,您可以使用 ProxyProvider 来动态地提供一个数据模型,该数据模型的创建依赖于另一个数据模型。

return MultiProvider(providers: [ChangeNotifierProvider(create: (context) => DataModel1()),ProxyProvider<DataModel1, DataModel2>(create: (context) => DataModel2(),update: (context, dataModel1, dataModel2) =>dataModel2..updateFrom(dataModel1),),],child: MyApp(),
);

在这个示例中,DataModel2 的创建依赖于 DataModel1。我们使用 ProxyProvider 来提供 DataModel2,并在更新函数中访问 DataModel1 并相应地更新 DataModel2

通过使用嵌套 Provider 和 ProxyProvider,您可以更好地管理和共享多个数据模型,并在整个应用程序中传递数据,使得状态管理更加灵活和强大。

高级用法和最佳实践

在使用 Provider 进行状态管理时,有一些高级用法和最佳实践可以帮助您更好地组织和管理代码。这些包括使用 ChangeNotifierProvider、ValueNotifierProvider 以及其他 Provider 类型,以及一些其他的技巧和建议。

使用 ChangeNotifierProvider

ChangeNotifierProvider 是最常用的 Provider 类型之一,它适用于管理实现了 ChangeNotifier 接口的数据模型。ChangeNotifier 是 Flutter 中的一个基类,它提供了通知依赖它的组件进行更新的机制。

return ChangeNotifierProvider(create: (context) => MyModel(),child: MyApp(),
);

使用 ValueNotifierProvider

ValueNotifierProvider 是另一个常用的 Provider 类型,它适用于管理实现了 ValueNotifier 接口的数据模型。与 ChangeNotifier 不同,ValueNotifier 可以直接提供新的值,而无需调用 notifyListeners()

return ValueNotifierProvider(create: (context) => MyValueModel(),child: MyApp(),
);

使用其他 Provider 类型

除了 ChangeNotifierProviderValueNotifierProvider,Provider 还提供了其他一些 Provider 类型,用于管理不同类型的数据模型:

  • StreamProvider:用于管理数据流,并在数据流中有新值时通知依赖它的组件进行更新。
  • FutureProvider:用于管理 Future,并在 Future 完成时通知依赖它的组件进行更新。
  • ListenableProvider:适用于管理实现了 Listenable 接口的数据模型,类似于 ValueNotifierProvider,但更通用。
return StreamProvider<MyStreamData>(create: (context) => myStream(),child: MyApp(),
);

最佳实践和注意事项

在使用 Provider 进行状态管理时,还有一些最佳实践和注意事项:

  • 避免滥用 Provider:尽管 Provider 提供了方便的状态管理机制,但过度使用 Provider 可能会导致代码难以维护和理解。只在需要跨多个组件共享的状态上使用 Provider。
  • 根据情况选择 Provider 类型:根据您的数据模型的特性和需求选择合适的 Provider 类型,以确保最佳的性能和开发体验。
  • 避免过度使用全局状态:尽量将状态局部化,只共享必要的状态,以减少不必要的依赖关系和重新构建。
  • 合理使用嵌套 Provider:嵌套 Provider 是一种强大的模式,但过度嵌套可能会导致组件树过深和性能问题。只在必要时使用嵌套 Provider。
  • 遵循 Flutter 的最佳实践:无论是在使用 Provider 还是其他状态管理解决方案时,始终遵循 Flutter 的最佳实践和约定,以确保代码的质量和性能。

通过合理地选择 Provider 类型、遵循最佳实践和注意事项,您可以更好地组织和管理代码,并使用 Provider 构建出高效、可维护的 Flutter 应用程序。

与其它状态管理工具的比较

在 Flutter 应用程序开发中,除了 Provider 外,还有一些其他流行的状态管理工具,比如 Bloc 和 Redux。下面将比较 Provider 与这些工具之间的异同点。

Provider vs. Bloc

Provider

  • 简单易用:Provider 提供了一种简单而强大的方式来共享和管理状态,适用于各种规模的应用程序。
  • 灵活性:Provider 提供了多种不同的 Provider 类型和使用方法,使得您可以根据具体需求选择合适的方式进行状态管理。
  • 与 Flutter 生态的集成:Provider 是 Flutter 生态中最受欢迎的状态管理解决方案之一,与 Flutter 框架高度集成,易于使用和学习。

Bloc

  • 单一数据流:Bloc 通过使用单一数据流的模式来管理应用程序的状态,使得状态更加可预测和可控。
  • 强类型:Bloc 使用强类型的事件和状态来描述应用程序的状态变化,有助于减少错误和提高代码质量。
  • 适用于复杂应用:Bloc 适用于处理复杂的应用程序逻辑和状态管理需求,尤其适用于大型应用和团队协作开发。

Provider vs. Redux

Provider

  • 轻量级:Provider 是一个轻量级的状态管理解决方案,适用于各种规模的应用程序,不会引入过多的复杂性。
  • 灵活性:Provider 提供了多种不同的使用方法和 Provider 类型,使得您可以根据具体情况选择合适的方式进行状态管理。
  • Flutter 生态的集成:Provider 与 Flutter 框架高度集成,易于使用和学习,是 Flutter 生态中最受欢迎的状态管理解决方案之一。

Redux

  • 单一数据源:Redux 通过使用单一数据源的模式来管理应用程序的状态,使得状态更加可预测和易于调试。
  • 不可变性:Redux 鼓励使用不可变数据模型,通过在状态变化时创建新的状态对象来确保状态的可追溯性和一致性。
  • 功能强大:Redux 提供了丰富的工具和中间件来处理复杂的状态管理需求,尤其适用于大型应用和需要高度可预测性的场景。

综上所述,Provider 是一个简单、灵活且轻量级的状态管理解决方案,适用于各种规模的 Flutter 应用程序。与此相比,Bloc 和 Redux 更适用于处理复杂的应用程序逻辑和状态管理需求,尤其适用于大型应用和需要高度可预测性的场景。选择合适的状态管理工具取决于您的应用程序的特性、规模和开发团队的偏好。

示例应用:购物车应用

在这个示例中,我们将创建一个简单的购物车应用,用于演示如何使用 Provider 来管理购物车的状态。

创建购物车数据模型

首先,我们创建一个购物车数据模型类,用于表示购物车的状态和操作。

import 'package:flutter/material.dart';class Cart with ChangeNotifier {List<String> _items = [];List<String> get items => _items;void addItem(String item) {_items.add(item);notifyListeners();}void removeItem(String item) {_items.remove(item);notifyListeners();}
}

实现购物车页面

接下来,我们实现一个简单的购物车页面,显示购物车中的物品,并提供添加和移除物品的操作。

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'cart.dart';class ShoppingCartPage extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Shopping Cart'),),body: Consumer<Cart>(builder: (context, cart, child) {return ListView.builder(itemCount: cart.items.length,itemBuilder: (context, index) {return ListTile(title: Text(cart.items[index]),trailing: IconButton(icon: Icon(Icons.remove_circle),onPressed: () {cart.removeItem(cart.items[index]);},),);},);},),floatingActionButton: FloatingActionButton(onPressed: () {Provider.of<Cart>(context, listen: false).addItem('New Item');},child: Icon(Icons.add),),);}
}

使用 Provider 管理购物车状态

最后,我们在应用程序的顶层 Widget 中注册购物车数据模型,并在购物车页面中使用 Provider 来访问和更新购物车的状态。

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'cart.dart';
import 'shopping_cart_page.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return ChangeNotifierProvider(create: (context) => Cart(),child: MaterialApp(title: 'Shopping App',theme: ThemeData(primarySwatch: Colors.blue,),home: ShoppingCartPage(),),);}
}

通过这个示例应用,您可以学习如何使用 Provider 来管理购物车的状态,并在应用程序中共享购物车数据模型,使得购物车页面可以实时更新,并响应用户的操作。

总结

在本文中,我们详细介绍了 Flutter 中的状态管理工具 Provider,并展示了如何使用 Provider 构建一个简单的购物车应用。接下来,让我们对 Provider 的优势与劣势进行总结,并分享一些最佳实践和注意事项,最后展望一下 Flutter Provider 的未来发展。

Provider 的优势与劣势

优势

  1. 简单易用:Provider 提供了简单而强大的状态管理解决方案,易于学习和使用。
  2. 灵活性:Provider 提供了多种 Provider 类型和使用方法,适用于各种规模的应用程序。
  3. 性能优化:基于 InheritedWidget 构建的 Provider 具有优秀的性能,能够有效管理状态更新和重建。
  4. 与 Flutter 生态的集成:Provider 是 Flutter 生态中最受欢迎的状态管理解决方案之一,与 Flutter 框架高度集成。

劣势

  1. 需要手动管理订阅:与某些状态管理工具相比,Provider 需要手动管理订阅,有时可能会导致代码冗余。

最佳实践和注意事项

  • 合理选择 Provider 类型:根据应用程序的特性和需求选择合适的 Provider 类型,以确保最佳的性能和开发体验。
  • 避免过度使用全局状态:尽量将状态局部化,只共享必要的状态,以减少不必要的依赖关系和重新构建。
  • 谨慎使用嵌套 Provider:嵌套 Provider 是一种强大的模式,但过度嵌套可能会导致组件树过深和性能问题。只在必要时使用嵌套 Provider。

Flutter Provider 的未来展望

随着 Flutter 生态的不断发展和改进,Provider 作为一个简单而强大的状态管理解决方案将继续发挥重要作用。未来,我们可以期待以下方面的改进和发展:

  • 性能优化:进一步优化 Provider 的性能,使其能够更好地处理大型应用程序和复杂状态管理场景。
  • 扩展性增强:提供更多的扩展功能和插件,以满足不同应用程序的需求,并且更好地与其他库和工具集成。
  • 更好的开发工具支持:提供更好的开发工具支持,包括调试工具和开发文档,使得开发者能够更轻松地使用 Provider 构建高质量的应用程序。

总的来说,Flutter Provider 作为一个简单、灵活且性能优异的状态管理解决方案,将继续成为 Flutter 开发者的首选之一,并且有望在未来进一步发展和壮大。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

Web Components初探

组件化&#xff0c;标签语义化&#xff0c;是前端发展的趋势。现在流行的组件化框架有React、Vue等&#xff0c;标签语义化在H5中添加的article、dialog等。 Web Components 就是类似的一套技术&#xff0c;允许您创建可重用的定制元素&#xff0c;并且在您的web应用中使用它们…

2024河北石家庄矿业矿山展览会|河北智慧矿山展会|河北矿博会

2024中国&#xff08;石家庄&#xff09;国际矿业博览会      时间&#xff1a;2024年7月4-6日 地点&#xff1a;石家庄国际会展中心.正定      随着全球经济的持续增长和矿产资源需求的不断攀升&#xff0c;矿业行业正迎来前所未有的发展机遇。作为矿业领域的盛会&…

代码随想录算法训练营第day60|84.柱状图中最大的矩形

84.柱状图中最大的矩形 力扣题目链接(opens new window) 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 思路&#xff1a; 为什么这么说呢&#xff…

浏览器工作原理与实践--作用域链和闭包 :代码中出现相同的变量,JavaScript引擎是如何选择的

在上一篇文章中我们讲到了什么是作用域&#xff0c;以及ES6是如何通过变量环境和词法环境来同时支持变量提升和块级作用域&#xff0c;在最后我们也提到了如何通过词法环境和变量环境来查找变量&#xff0c;这其中就涉及到作用域链的概念。 理解作用域链是理解闭包的基础&#…

如何在Linux系统使用Docker本地部署Halo网站并实现无公网IP远程访问

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可…

GEC6818开机自动加载驱动与更改开发板的RTC时钟

GEC6818开机自动加载驱动与更改开发板的RTC时钟 本文主要涉及&#xff1a; 1.GEC6818开机自动加载驱动 2.更改开发板的RTC时钟 文章目录 GEC6818开机自动加载驱动与更改开发板的RTC时钟一、开机自动加载驱动或运行程序**STEP1&#xff1a;** 使用vi打开文件profile.命令如下**S…

Gitlab的流水线任务【实现每小时自动测试 dev分支的更新】

背景 在现代软件开发实践中&#xff0c;持续集成&#xff08;Continuous Integration, CI&#xff09;是确保代码质量和快速响应软件缺陷的关键策略。GitLab 提供了强大的 CI/CD 功能&#xff0c;允许开发者自动化测试和部署流程。本文将介绍如何设置 GitLab 流水线计划任务&a…

GPT5都要来了,现在登录就送!!!

据《商业内幕》报道&#xff0c;OpenAI计划在未来几个月内推出ChatGPT的更强大版本。 据两位知情人士透露&#xff0c;这款名为GPT-5的新型人工智能模型预计将在今年夏天发布。在发布之前&#xff0c;一些企业据称已经尝试了该工具的演示版本&#xff0c;以测试其升级后的能力。…

Windows系统安装Elasticsearch结合内网穿透实现远程团队数据共享

文章目录 系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装 Cpolar4. 创建Elasticsearch公网访问地址5. 远程访问Elasticsearch6. 设置固定二级子域名 Elasticsearch是一个基于Lucene库的分布式搜索和分析引擎&#xff0c;它提供了一个分布式、多…

php 快速入门(七)

一、操作数据库 1.1 操作MySQL的步骤 第一步&#xff1a;登录MySQL服务器 第二步&#xff1a;选择当前数据库 第三步&#xff1a;设置请求数据的字符集 第四步&#xff1a;执行SQL语句 1.2 连接MySQL 函数1&#xff1a;mysql_connect() 功能&#xff1a;连接&#xff08;登录…

权限提升-Win系统权限提升篇AD内网域控NetLogonADCSPACKDCCVE漏洞

知识点 1、WIN-域内用户到AD域控-CVE-2014-6324 2、WIN-域内用户到AD域控-CVE-2020-1472 3、WIN-域内用户到AD域控-CVE-2021-42287 4、WIN-域内用户到AD域控-CVE-2022-26923 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权…

常见技术难点及方案

1. 分布式锁 1.1 难点 1.1.1 锁延期 同一时间内不允许多个客户端同时获得锁&#xff1b; 1.1.2 防止死锁 需要确保在任何故障场景下&#xff0c;都不会出现死锁&#xff1b; 1.2.3 可重入 特殊的锁机制&#xff0c;它允许同一个线程多次获取同一个锁而不会被阻塞。 1.2…

新火种AI|大厂围剿,“长文本”成不了Kimi的护城河

作者&#xff1a;一号 编辑&#xff1a;美美 长文本之后&#xff0c;Kimi能找到新的“护城河”吗&#xff1f; 过去的一周&#xff0c;由AI技术天才杨植麟的大模型初创企业月之暗面及其产品Kimi所带来的连锁反应&#xff0c;从社交媒体一路冲向了A股&#xff0c;带动了一批“…

【Java程序设计】【C00392】基于(JavaWeb)Springboot的校园生活服务平台(有论文)

基于&#xff08;JavaWeb&#xff09;Springboot的校园生活服务平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过…

LeetCode_1.两数之和

一、题目描述 二、方法 1.方法1&#xff08;暴力枚举法&#xff09; 利用两个for循环&#xff0c;对数组进行逐一的遍历&#xff0c;直到找到两个数的和为目标值时返回这两个数的下标。以下为c实现的完整代码。 # include<iostream> using namespace std; #include<…

大数据开发扩展shell--尚硅谷shell笔记

大数据开发扩展shell 学习目标 1 熟悉shell脚本的原理和使用 2 熟悉shell的编程语法 第一节 Shell概述 1&#xff09;Linux提供的Shell解析器有&#xff1a; 查看系统中可用的 shell [atguiguhadoop101 ~]$ cat /etc/shells /bin/sh/bin/bash/sbin/nologin/bin/dash/bin/t…

javaWeb项目-火车票订票信息系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Spring Boot框架 …

【Linux C | 多线程编程】线程的创建、线程ID、线程属性

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-03-22 0…

#Linux(SSH软件安装及简单使用)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;终端键入&#xff08;root权限&#xff09;安装 apt-get install openssh-server 安装时遇到报错 E: Could not get lock /var/lib/dpkg/…

如何用c解决汉诺塔问题!

汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重…