Flutter:跨平台移动应用开发的未来

news2024/10/3 10:39:45

Flutter:跨平台移动应用开发的未来

引言

Flutter的背景和概述

Flutter是由Google开发的一个开源UI工具包,用于构建漂亮、快速且高度可定制的移动应用程序。它于2017年首次发布,并迅速引起了开发者们的关注。Flutter采用了一种全新的方法来构建用户界面,通过使用自绘UI技术,可以实现高性能的跨平台应用开发。

Flutter的优势和特点

  1. 快速开发:Flutter提供了丰富的预构建组件,使开发人员能够快速构建复杂的用户界面。同时,热重载功能使开发过程更加高效,能够实时查看代码更改的效果。

  2. 跨平台支持:Flutter可以同时在iOS和Android等多个平台上运行,而且应用的外观和性能几乎一致。这意味着开发者只需编写一套代码,就能在各个平台上发布应用。

  3. 自绘UI:Flutter使用Skia图形引擎来绘制UI界面,这使得应用程序具有卓越的性能和视觉效果。通过自绘UI技术,开发者能够实现高度定制化的用户界面,满足不同项目的需求。

  4. 响应式编程:Flutter采用了响应式编程模型,即UI是根据状态的变化而变化的。这种模型使得开发者可以轻松地管理和更新应用程序的状态,简化了复杂的UI交互逻辑。

  5. 强大的工具和社区支持:Flutter拥有丰富的开发工具和强大的社区支持。例如,Flutter提供了一套全功能的集成开发环境(IDE),称为Flutter SDK,同时还有大量的插件和三方库可供开发者使用。

示例代码:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text(
          'Welcome to Flutter!',
          style: TextStyle(fontSize: 24),
        ),
      ),
    );
  }
}

上述示例展示了一个简单的Flutter应用程序,其中通过使用预构建的组件和布局来创建了一个带有标题栏和居中文本的页面。这个示例突显了Flutter的快速开发和跨平台支持的优势。

Flutter的基本原理

Flutter框架简介

Flutter框架是一个完整的应用程序开发框架,它由三个核心部分组成:Flutter引擎、Flutter Framework和Flutter插件。Flutter引擎是一个高性能的渲染引擎,负责处理图形渲染、动画和输入事件等底层操作。Flutter Framework是一个功能丰富的UI框架,提供了一系列用于构建用户界面的预构建组件和工具。Flutter插件允许开发者集成原生系统功能和第三方SDK等。

Dart语言与Flutter的关系

Dart是Flutter的官方编程语言,它是一种面向对象的语言,具有强类型和即时编译等特点。Flutter使用Dart作为开发语言,因为Dart具有良好的可读性和易于学习的特点,并且与Flutter框架紧密配合。开发者可以使用Dart来编写应用程序的业务逻辑和界面描述。

Widget和Element的概念

在Flutter中,UI构建的基本单位是Widget。Widget是一种不可变的对象,它描述了一个UI元素的配置和外观。Flutter提供了大量的预构建Widget,如文本、按钮、图片等,开发者也可以自定义Widget来满足特定需求。Widget可以根据应用程序的状态和属性进行构建,并且可以嵌套和组合,形成复杂的UI结构。

Widget在Flutter中是通过Element来渲染的。Element是Widget在屏幕上的实例,它负责管理Widget的生命周期和状态。当应用程序的状态发生变化时,Flutter会重新构建相应的Widget,并更新对应的Element。这种基于响应式编程的方式使得开发者能够轻松地更新和管理应用程序的UI。

示例代码:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: TextStyle(fontSize: 24),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

上述示例展示了一个简单的计数器应用程序,其中使用了Flutter中的StatefulWidget来管理状态。每次点击按钮时,计数器的值会增加,并通过调用setState()方法来更新UI。这个示例突出了Widget和Element的概念,以及Flutter的响应式编程模型。

Flutter开发环境搭建

安装Flutter SDK

要开始使用Flutter进行应用程序开发,首先需要安装Flutter SDK。下面是安装步骤:

  1. 下载Flutter SDK:打开Flutter官方网站(https://flutter.dev/),点击"Get Started"按钮,在页面的右侧找到适合你操作系统的下载链接,并下载Flutter SDK压缩包。

  2. 解压Flutter SDK:将下载的Flutter SDK压缩包解压到你喜欢的目录下。例如,你可以将其解压到C:\flutter(Windows)或~/flutter(macOS或Linux)。

  3. 配置环境变量:将Flutter的bin目录添加到你的系统环境变量中。这样,你就可以在任何位置运行Flutter命令了。

配置开发环境

在安装完Flutter SDK后,还需要配置开发环境以确保能够顺利地构建和运行Flutter应用程序。下面是配置步骤:

  1. 配置Flutter工具:打开命令行终端,运行flutter doctor命令,它会检查你的系统并列出任何缺少的依赖项或配置。如果有任何问题,按照提示进行修复。

  2. 安装Android Studio(可选):如果你计划使用Flutter开发Android应用程序,建议安装Android Studio。它提供了一个集成开发环境(IDE),可以更方便地开发和调试Flutter应用程序。

  3. 配置Android设备或模拟器:要在Android设备或模拟器上运行Flutter应用程序,需要先配置好设备。如果你使用Android Studio,可以通过它来创建和管理设备。

创建第一个Flutter应用

安装完Flutter SDK并配置好开发环境后,现在可以创建你的第一个Flutter应用程序了。下面是创建步骤:

  1. 在命令行终端中,使用flutter create命令创建新的Flutter应用程序。例如,运行flutter create my_app将在当前目录下创建一个名为my_app的新应用程序。

  2. 进入应用程序目录:运行cd my_app命令进入应用程序目录。

  3. 启动应用程序:运行flutter run命令启动应用程序。如果有连接的Android设备或模拟器,Flutter将会自动在设备上运行你的应用程序。

  4. 在编辑器中打开应用程序:使用你喜欢的代码编辑器(如Android Studio、Visual Studio Code等)打开应用程序目录。

  5. 修改应用程序:在打开的编辑器中,你将看到Flutter应用程序的初始代码。你可以根据需要修改代码,并实时查看修改后的效果。

示例代码:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My First Flutter App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text(
          'Hello, Flutter!',
          style: TextStyle(fontSize: 24),
        ),
      ),
    );
  }
}

上述示例代码展示了一个简单的Flutter应用程序,它显示了一个带有标题栏和居中文本的页面。你可以根据需要修改并扩展这个应用程序,以满足你的需求。现在你已经成功创建了你的第一个Flutter应用程序!

Flutter核心组件和功能

Flutter是一个基于组件构建的UI框架,其核心就是Widget库。在这一部分中,我们将介绍Flutter的常用组件,以及Flutter的响应式编程模型。

Widget库的介绍和常用组件

在Flutter中,界面上所有的元素都是通过Widget来构建的。Widget可以是一个单独的UI元素,也可以是包含其他Widget的复合元素。下面是Flutter中常用的几个组件:

  1. 布局组件

布局组件用于控制子组件的位置、大小和排列方式。常用的布局组件有:

  • Container:一个带有样式、填充和边框的容器。
  • Row:水平排列子组件的组件。
  • Column:垂直排列子组件的组件。
  • Stack:重叠子组件的组件。
  • Flex:使用Flex布局模型排列子组件的组件。

示例代码:

Container(
  width: 200,
  height: 200,
  decoration: BoxDecoration(
    color: Colors.white,
    borderRadius: BorderRadius.circular(10),
    boxShadow: [
      BoxShadow(
        color: Colors.grey.withOpacity(0.5),
        spreadRadius: 5,
        blurRadius: 7,
        offset: Offset(0, 3), // changes position of shadow
      ),
    ],
  ),
  child: Center(child: Text('Hello, Flutter!')),
)
  1. 文本和样式组件

文本和样式组件用于显示文本,并控制文本的样式和布局。常用的文本和样式组件有:

  • Text:显示简单文本的组件。
  • RichText:可以使用多种样式显示复杂文本的组件。
  • TextStyle:定义文本样式的类。

示例代码:

Text(
  'Hello, Flutter!',
  style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
)
  1. 图片和图标组件

图片和图标组件用于显示图像资源。常用的图片和图标组件有:

  • Image:显示网络或本地的图片资源。
  • Icon:显示内置或自定义图标的组件。

示例代码:

Image.network(
  'https://flutter.dev/assets/homepage/carousel/1.jpg',
  width: 200,
  height: 200,
  fit: BoxFit.cover,
)
  1. 用户输入组件

用户输入组件用于接收用户的输入。常用的用户输入组件有:

  • TextField:用于接收单行文本输入的组件。
  • TextFormField:在TextField基础上增加了表单验证和错误提示功能。
  • RaisedButton:带有点击事件的按钮。

示例代码:

TextField(
  decoration: InputDecoration(
    hintText: '请输入用户名',
  ),
  onChanged: (value) {
    print('输入内容:$value');
  },
)
  1. 动画和转场效果组件

Flutter提供了一系列动画和转场效果组件,可以帮助开发者实现各种动画效果。常用的动画和转场效果组件有:

  • AnimatedBuilder:动态构建子组件的组件。
  • Hero:在页面之间传递动画的组件。
  • PageView:滑动切换页面的组件。

示例代码:

AnimatedContainer(
  width: _isExpanded ? 200 : 50,
  height: _isExpanded ? 50 : 200,
  color: Colors.blue,
  duration: Duration(seconds: 1),
  curve: Curves.fastOutSlowIn,
)

Flutter的响应式编程模型

在Flutter中,所有的Widget都是不可变的。当Widget的状态变化时,Flutter会自动重新构建UI。Flutter的响应式编程模型是基于Stateful和Stateless Widget来实现的。

  1. Stateful和Stateless Widget

Stateless Widget是一种不可变的Widget,它的属性一旦设置就无法改变。如果需要在Widget中保存状态,就需要使用Stateful Widget。Stateful Widget包含两个部分:外部的Widget和内部的State。外部的Widget是不可变的,而内部的State则是可变的。

示例代码:

class MyWidget extends StatefulWidget {
  const MyWidget({ Key? key }) : super(key: key);

  
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('My Widget')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('You have pressed the button $_counter times.'),
            ElevatedButton(
              onPressed: _incrementCounter,
              child: Text('Increment'),
            ),
          ],
        ),
      ),
    );
  }
}
  1. StatefulWidget的生命周期

StatefulWidget有一个生命周期,它包括以下几个方法:

  • createState:创建State对象。
  • initState:初始化State对象。
  • didChangeDependencies:当State对象依赖的对象发生变化时调用。
  • build:构建Widget树。
  • setState:更新State对象。
  • deactivate:销毁State对象。

示例代码:

class MyWidget extends StatefulWidget {
  const MyWidget({ Key? key }) : super(key: key);

  
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  int _counter = 0;

  
  void initState() {
    super.initState();
    print('initState');
  }

  
  Widget build(BuildContext context) {
    print('build');
    return Scaffold(
      appBar: AppBar(title: Text('My Widget')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('You have pressed the button $_counter times.'),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  _counter++;
                });
              },
              child: Text('Increment'),
            ),
          ],
        ),
      ),
    );
  }

  
  void deactivate() {
    super.deactivate();
    print('deactivate');
  }

  
  void didChangeDependencies() {
    super.didChangeDependencies();
    print('didChangeDependencies');
  }
}
  1. 状态管理

在开发Flutter应用程序时,状态管理是一个非常重要的问题。Flutter提供了一些机制来帮助开发者有效地管理状态。常用的状态管理方式有:

  • Provider:一种轻量级的状态管理框架。
  • Bloc:一种基于响应式编程模型的状态管理框架。
  • Redux:一种数据流框架,可用于跨组件共享状态。

示例代码:

class MyWidget extends StatelessWidget {
  final int counter;

  const MyWidget({Key? key, required this.counter}) : super(key: key);

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('My Widget')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('You have pressed the button $counter times.'),
            ElevatedButton(
              onPressed: () {
                Navigator.of(context).push(MaterialPageRoute(builder: (context) => MyWidget(counter: counter + 1)));
              },
              child: Text('Increment'),
            ),
          ],
        ),
      ),
    );
  }
}

Flutter的跨平台能力

Flutter是一个跨平台的UI框架,可以在多个平台上构建高性能、高保真度的应用程序。本部分将介绍Flutter支持的平台和设备,以及Flutter响应式UI设计的优势和Flutter与原生代码的交互。

支持的平台和设备

Flutter支持以下平台和设备:

  • iOS:Flutter可以在iOS上运行,并且可以使用Xcode进行开发和调试。
  • Android:Flutter可以在Android上运行,并且可以使用Android Studio进行开发和调试。
  • Web:Flutter可以通过使用Flutter for Web将应用程序转换为Web应用程序。
  • Windows和macOS:Flutter可以在Windows和macOS上运行,并且可以使用Visual Studio Code进行开发和调试。
  • Linux:Flutter可以在Linux上运行,并且可以使用Visual Studio Code进行开发和调试。

响应式UI设计的优势

Flutter采用了响应式UI设计的理念,这意味着当应用程序状态发生变化时,Flutter会自动更新UI。这种设计方式具有以下优势:

  • 更快的开发速度:由于Flutter可以自动更新UI,开发者可以更快地编写应用程序,而不必手动处理UI更新问题。
  • 更高的可重用性:由于Flutter采用组件化的设计方式,开发者可以重复使用现有的组件,从而更快地构建应用程序。
  • 更好的可维护性:由于Flutter可以自动更新UI,开发者可以更容易地维护应用程序,并且可以避免由于手动处理UI更新问题导致的错误。

Flutter与原生代码的交互

Flutter提供了一些机制来与原生代码进行交互。开发者可以使用以下方法将Flutter应用程序集成到原生平台中:

  • Platform Channel:通过Platform Channel,开发者可以在Flutter和原生平台之间进行双向通信。
  • Method Channel:通过Method Channel,开发者可以调用原生平台上的方法,并获取返回值。
  • Event Channel:通过Event Channel,开发者可以接收来自原生平台的事件。

示例代码:

Flutter调用原生平台方法:

static const platform = const MethodChannel('my_flutter_app_name');

Future<void> _getBatteryLevel() async {
  String batteryLevel;
  try {
    final int result = await platform.invokeMethod('getBatteryLevel');
    batteryLevel = 'Battery level at $result % .';
  } on PlatformException catch (e) {
    batteryLevel = "Failed to get battery level: '${e.message}'.";
  }
  setState(() {
    _batteryLevel = batteryLevel;
  });
}

原生平台调用Flutter方法:

new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
        new MethodCallHandler() {
            @Override
            public void onMethodCall(MethodCall call, MethodChannel.Result result) {
                if (call.method.equals("sayHello")) {
                    String message = "Hello, Flutter!";
                    result.success(message);
                } else {
                    result.notImplemented();
                }
            }
        }
);

总之,Flutter是一个强大的跨平台UI框架,支持多个平台和设备。Flutter响应式UI设计的优势使得开发者可以更快、更高效地构建应用程序,并且更容易地维护应用程序。Flutter还提供了一些机制来与原生代码进行交互,使得开发者可以更轻松地将Flutter应用程序集成到原生平台中。

Flutter在实际项目中的应用

Flutter的适用场景

Flutter是一个功能强大的跨平台UI框架,适用于各种实际项目。以下是一些适用场景的示例:

  1. 移动应用程序开发:Flutter可以用于构建高性能、流畅的移动应用程序,同时支持iOS和Android平台。通过使用Flutter,开发者可以节省时间和资源,只需编写一次代码即可在多个平台上运行。

  2. 嵌入式设备和物联网应用程序:Flutter可以在嵌入式设备和物联网应用程序中使用,通过使用Flutter可以快速构建出色的用户界面,并与设备进行交互。

  3. 桌面应用程序开发:Flutter不仅可以用于移动应用程序开发,还可以用于构建高性能的桌面应用程序。通过使用Flutter,开发者可以在Windows、macOS和Linux平台上构建具有相同外观和行为的应用程序。

  4. 媒体和娱乐应用程序:Flutter具有强大的图形渲染能力和丰富的动画支持,非常适合开发媒体和娱乐应用程序。开发者可以使用Flutter创建交互式和吸引人的用户界面,提供出色的用户体验。

实际案例分析和经验分享

以下是一些实际案例和经验分享,展示了Flutter在各种项目中的成功应用:

  1. Google Ads:Google Ads是Google的广告平台,它使用Flutter构建了其移动应用程序。通过使用Flutter,Google Ads能够快速迭代和交付新功能,在iOS和Android平台上提供一致且高质量的用户体验。

  2. Alibaba:阿里巴巴集团是中国著名的互联网公司,他们使用Flutter构建了多个移动应用程序,包括淘宝、支付宝和钉钉等。Flutter的跨平台能力使得阿里巴巴能够更高效地开发和维护这些应用程序,并为用户提供流畅和一致的体验。

  3. Hamilton:Hamilton是一款著名的音乐剧,他们使用Flutter构建了他们的官方应用程序。通过使用Flutter,Hamilton能够在iOS和Android平台上提供令人惊叹的用户界面和动画效果,为用户带来与音乐剧本身相匹配的精彩体验。

  4. Tencent Video:腾讯视频是中国最大的在线视频平台之一,他们使用Flutter构建了他们的移动应用程序。Flutter的高性能和丰富的动画支持使得腾讯视频能够提供流畅的视频播放和用户界面,为用户带来优质的观看体验。

总之,Flutter在实际项目中有着广泛的应用。它适用于各种场景,包括移动应用程序开发、嵌入式设备和物联网应用程序、桌面应用程序开发以及媒体和娱乐应用程序。通过一些成功案例的分析和经验分享,我们可以看到Flutter在提高开发效率、提供一致用户体验方面的优势。无论是大型互联网公司还是创业企业,Flutter都是一个强大的工具,可以帮助开发者构建出色的应用程序。

Flutter的生态系统和社区支持

Flutter的插件和库

Flutter的插件和库是Flutter生态系统中不可或缺的一部分。它们为开发者提供了许多功能强大的工具和资源,帮助开发者更快速、更高效地完成应用程序的开发。

Flutter官方提供了许多常用的插件和库,例如:

  1. flutter_bloc:用于实现业务逻辑分离和状态管理的库。

  2. provider:用于实现状态管理和依赖注入的库。

  3. flutter_redux:用于实现Redux架构的库。

除此之外,Flutter社区也有很多优秀的第三方插件和库,例如:

  1. flutter_map:用于在Flutter中集成地图的库。

  2. flutter_webview_plugin:用于在Flutter中集成WebView的插件。

  3. dio:用于在Flutter中进行网络请求的库。

学习资源和开发工具

Flutter社区提供了许多学习资源和开发工具,帮助新手更好地学习和使用Flutter。以下是一些常用的学习资源和开发工具:

  1. Flutter官网:官网提供了完整的文档、示例和教程,帮助新手快速上手。

  2. Flutter中文网:中文网站提供了中文的文档和教程,方便中国开发者学习和使用Flutter。

  3. Flutter Gallery:Flutter Gallery是一个展示Flutter功能和UI组件的应用程序,可以帮助开发者更好地了解Flutter的各种功能和用法。

  4. DartPad:DartPad是一个在线的Dart编程环境,可以在浏览器中直接编写和运行Dart代码。

Flutter社区的活跃度

Flutter社区非常活跃,有许多优秀的开发者和贡献者。Flutter社区经常举办Meetup、大会和Hackathon等活动,以促进Flutter生态系统的发展和成长。

Flutter社区还拥有一个开放的GitHub仓库,允许任何人提交自己的代码和贡献。Flutter社区的Github仓库中包含了许多开源的Flutter项目和插件,这些项目和插件为Flutter开发者提供了许多有价值的资源和工具。

结论

Flutter是一个非常年轻的框架,但它已经展现出了强大的潜力和前景。Flutter的跨平台能力、高性能和丰富的UI支持使得它在未来得到广泛应用的可能性非常大。

Flutter的未来发展趋势可以从以下几个方面来看:

  1. 更好的性能和稳定性:Flutter将持续改进和优化其性能和稳定性,以满足开发者和用户的需求。

  2. 更丰富的UI组件库:Flutter将不断扩展其UI组件库,以提供更多丰富的UI组件和动画效果。

  3. 更多的第三方插件和库:随着Flutter的普及,预计会有更多的第三方插件和库涌现,为Flutter开发者提供更多有价值的资源和工具。

本文主要介绍了Flutter框架的特点、优势和适用场景。同时,本文还介绍了Flutter生态系统中的插件和库、学习资源和开发工具以及社区支持。最后,本文对Flutter的未来发展进行了展望和分析。总之,Flutter是一个非常强大的框架,它为开发人员提供了许多有用的工具和资源,使得开发高质量的移动应用程序变得更加容易和快捷。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pip install flagai时出现Collecting PyYAML==5.4.1 (from flagai)等错误信息的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

7.【CPP】String类

一.汉字的编码 我们知道计算机存储英文字母&#xff0c;标点&#xff0c;数字用的是ascall码&#xff0c;128种用一个字节表示绰绰有余。而汉字远远不止128种&#xff0c;因此汉字需要两个字节表示。 1.gbk编码中汉字占两个字节。 2.utf-8中&#xff0c;一个汉字占三个字节。…

Oracle Linux 6.10 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

第十回 朱贵水亭施号箭 林冲雪夜上梁山-FreeBSD/Linux 控制台基础操作

林冲被众庄客捉住&#xff0c;吊在门楼下&#xff0c;正被打时&#xff0c;柴进来了&#xff0c;赶快把林冲救下来。原来这是柴进打猎用的小庄子&#xff0c; 林冲就把火烧草料场一事跟柴进详细的说了。柴进说兄弟真是命运多磨难啊。林冲住了几日&#xff0c;恐怕连累柴进&…

Spring+SprinMVC+MyBatis配置方式简易模板

SpringSprinMVCMyBatis配置方式简易模板代码Demo GitHub访问 ssm-tpl-cfg 一、SQL数据准备 创建数据库test&#xff0c;执行下方SQL创建表ssm-tpl-cfg /*Navicat Premium Data TransferSource Server : 127.0.0.1Source Server Type : MySQLSource Server Versio…

网络编程 day6

网络聊天室项目 1.服务器端 #include <head.h> #define SER_IP "192.168.125.11" #define SER_PORT 6666 typedef struct Msg {char user[32]; //用户名int type; //1.登录、2.发消息、0.退出char text[1024]; //消息 } msg_t; typedef struct List…

Vue diff原理

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

Med-YOLO:3D + 医学影像 + 检测框架

Med-YOLO&#xff1a;3D 医学影像 检测框架 提出背景设计思路网络设计训练设计讨论分析 魔改代码&#xff1a;加强小目标检测总结 提出背景 论文链接&#xff1a;https://arxiv.org/abs/2312.07729 代码链接&#xff1a;https://github.com/JDSobek/MedYOLO 提出背景&…

助力焊接场景下自动化缺陷检测识别,基于YOLOv8【n/s/m/l/x】全系列参数模型开发构建工业焊接场景下工件表面焊接裂纹缺陷检测识别分析系统

焊接是一个不陌生但是对于开发来说相对小众的场景&#xff0c;在工件表面焊接场景下常常有对工件表面缺陷智能自动化检测识别的需求&#xff0c;工业AI结合落地是一个比较有潜力的场景&#xff0c;在我们前面的博文开发实践中也有一些相关的实践&#xff0c;感兴趣的话可以自行…

一周时间,开发了一款封面图生成工具

介绍 这是一款封面图的制作工具&#xff0c;根据简单的配置即可生成一张好看的封面图&#xff0c;目前已有七款主题可以选择。做这个工具的初衷来自平时写文章&#xff0c;都为封面图发愁&#xff0c;去图片 网站上搜索很难找到满意的&#xff0c;而且当你要的图如果要搭配上文…

【OCR项目】之用HALCON的深度学习工具进行文字识别,并导出到C++调用

前言 HALCON是一个强大的机器视觉工具&#xff0c;包含了2D&#xff0c;3D图像各种算子&#xff0c;以及各种任务的深度学习工具&#xff0c;包括目标检测&#xff0c;实例分割&#xff0c;文字识别等。 这次从实际生产的角度&#xff0c;来分享一下如何用HALCON进行文字识别…

基于 IDEA 创建 Maven 工程

1. 概念梳理Maven工程的GAVP Maven工程相对之前的项目&#xff0c;多出一组gavp属性&#xff0c;gav&#xff08;表示当前工程的坐标&#xff09;需要我们在创建项目的时候指定&#xff0c;p&#xff08;表示打包方式&#xff09;有默认值&#xff08;默认为 jar 包&#xff0…

web架构师编辑器内容-拖动元素改变元素的位置和大小的完成

拖动移动元素 改变编辑器的定位系统 我们目前的元素都是按照块级元素直接自上而下的排列在画布中&#xff0c;为了让元素实现精确的定位和调整&#xff0c;我们需要改变这些元素的定位实现。我们需要让这些元素画布区域来进行绝对定位。如果我们有一个元素有这些已经保存的 c…

第15届蓝桥杯嵌入式省赛准备第三天总结笔记(使用STM32cubeMX创建hal库工程+串口接收发送)

因为我是自己搞得板子&#xff0c;原本的下程序和串口1有问题&#xff0c;所以我用的是串口2&#xff0c;用的PA2和PA3 一&#xff0c;使用CubeMX配置串口 选择A开头的这个是异步通信。 配置串口参数&#xff0c;往届的题基本用的9600波特率&#xff0c;所以我这里设置为9600…

【Linux】Ubuntu的gnome切换KDE Plasma

文章目录 安装KDE Plasma桌面环境添加软件源并更新apt安装kubuntu-desktop&#xff08;作者没有成功&#xff09;aptitude安装kubuntu-desktop多次aptitude install&#xff08;特别重要特别重要&#xff09;其他kde软件包 卸载gnome桌面 Ubuntu自带的桌面环境是gnome&#xff…

cuda二进制文件中到底有些什么

大家好。今天我们来讨论一下&#xff0c;相比gcc编译器编译的二进制elf文件&#xff0c;包含有 cuda kernel 的源文件编译出来的 elf 文件有什么不同呢&#xff1f; 之前研究过一点 tvm。从 BYOC 的框架中可以得知&#xff0c;前端将模型 partition 成 host 和 accel(accel 表…

《WebKit 技术内幕》之六(2): CSS解释器和样式布局

2 CSS解释器和规则匹配 在了解了CSS的基本概念之后&#xff0c;下面来理解WebKit如何来解释CSS代码并选择相应的规则。通过介绍WebKit的主要设施帮助理解WebKit的内部工作原理和机制。 2.1 样式的WebKit表示类 在DOM树中&#xff0c;CSS样式可以包含在“style”元素中或者使…

【QT+QGIS跨平台编译】之四:【libSSH2+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、libSSH2介绍二、文件下载三、文件分析四、pro文件五、编译实践 一、libSSH2介绍 libSSH2是一个开源的C函数库&#xff0c;用来实现SSH2协议。 SSH(Secure SHell)到目前为止有两个不兼容的版本——SSH1和SSH2。 SSH2避免了RSA的专利问题&#xff0c;并修补了CRC…

C#winform上位机开发学习笔记2-串口助手的定时发送功能添加

1.功能描述 选择自动发送功能后&#xff0c;按照设定的发送时间发送数据 2.代码部分 增加计时器空间Timer 使能计时器&#xff0c;默认设置定时时间为1秒 组合框设置默认复选信息 编写选择框事件函数 //自动发送事件private void checkBox27_CheckedChanged(object sender, E…

37-WEB漏洞-反序列化之PHPJAVA全解(上)

WEB漏洞-反序列化之PHP&JAVA全解&#xff08;上&#xff09; 一、PHP 反序列化原理二、案例演示2.1、无类测试2.1.1、本地2.1.2、CTF 反序列化小真题2.1.3、CTF 反序列化类似题 2.2、有类魔术方法触发2.2.1、本地2.2.2、网鼎杯 2020 青龙大真题 三、参考资料 一、PHP 反序列…