Flutter1.0入门基础

2023-10-26

Flutter1.0入门基础

注:原课程视频是基于Flutter1的;

目标:

  • 开发入门:工具、环境搭建、入门必备
  • 开发技巧:导航框架、常用功能
  • 开发流程:网络、数据存储、列表、Flutter与Native混编
  • 工程封装:模块开发、AI结合
  • 项目上手:包和插件的开发、屏幕适配和兼容、打包与发布、Flutter的升级和适配;
导航框架实现:Scaffold+PageView
服务端交互:http
页面路由跳转:Navigator
监听列表滚动:NotificationListener
自定义组件
封装Native代码:NativeModules
Native实现智能语音
FLutter与native通信:Channel通信
各种插件和组件的使用;

滚动渐变
智能语音
富文本展示
混合开发(与ios android h5)
瀑布流布局
加载刷新
自定义webview

开发工具需安装:Flutter Plugin、Dart Plugin、Dart DevTools

布局:
  声明式布局
  Layout Widgets
导航:
  Navigator
  MaterialPageRoute
  PageRouteBuilder
列表:
  ListView
  GridView
  ExpansionTile(可折叠列表)
图片:
  Image
    静态图片
    Native图片
    网络图片
    图片缓存
    Icon
    Placeholder
Flutter组件:
  Flutter插件:
    flutter_webview_plugin
    cupertino_icons
    page_view_indicator
    flutter_swiper
    http
    flutter_staggered_grid_view
    flutter_statusbar_manager
    ...
Native插件:
  百度AI智能语音
  ...
自定义组件:
  loading_container
  asr_manager
  webview
  search_bar
网络和存储:
  http
  shared_preferences
  JSON解析和模型转换
  Future(异步编程)
  FutureBuilder(异步UI)
动画:
  基础动画
    AnimateWidget
    AnimatedBuilder
    Animation
    AnimationController
    Tween
    CurvedAnimation
  Hero动画(实现页面间跳转动画)
高级:
  Native Modules:智能AI语音
  Flutter混合开发:
    + Android
    + iOS
    + H5
  通信:
    BasicMessageChannel
    MethodChannel
    EventChannel
  全面屏/折叠屏适配:
    iOS、Android全面屏适配
    折叠屏适配
  Flutter更新升级
打包发布    

IDE:推荐AndroidStudio;

环境搭建

  • 确认系统要求
  • 设置Flutter镜像
  • 获取Flutter SDK
  • iOS开发环境配置
  • Android开发环境设置

命令行工具:

  • bash curl git 2.x mkdir rm unzip which

设置镜像:

  • 编辑当前用户主目录.bash_profile文件
  • export PUB_HOSTED_URL=https://pub.flutter-io.cn
  • export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

注:此镜像为临时镜像,并不能保证一直有用,可以参考官网进行配置;

下载Flutter SDK:

  • 官网下载,解压到主目录(或其他目录)flutter目录;
  • 添加环境变量:export PATH=/Users/huaqiang/flutter/bin:$PATH
  • flutter doctor:第一次运行会很慢
# 相关环境变量

# Android 环境变量
export ANDROID_HOME=/Users/huaqiang/Library/Android/sdk

# Android 模拟器路径
export PATH=${
   PATH}:${
   ANDROID_HOME}/emulator

# Android tools 路径
export PATH=${
   PATH}:${
   ANDROID_HOME}/tools

# Android 平台工具路径
export PATH=${
   PATH}:${
   ANDROID_HOME}/platform-tools

# Android NDK路径
export ANDROID_NDK_HOME=/Users/huaqiang/Library/Android/ndk/android-ndk-r10e

# Flutter 镜像
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

# Flutter环境变量
export PATH=/Users/huaqiang/flutter/bin:$PATH

iOS开发环境设置:

  • 下载安装xcode
  • 配置xcode使命令行工具使用新安装的xcode版本:sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer(也可以指定不同版本的xcode)
  • xcode许可协议通过:sudo xcodebuild -license

iOS模拟器:

  • 使用xcode启动,或通过命令:open -a Simulator

创建Flutter项目:

  • flutter create my_app
  • cd my_app/
    • ios:iOS端宿主项目
    • android:Android端宿主项目
    • pubspec.yaml:Flutter依赖包的配置文件
    • lib:flutter Dart代码
    • 运行项目(命令行方式):flutter run
      • r:热加载
      • R:热重启
      • q:退出
      • h:请求帮助

iOS的真机调试:

# 安装Homebrew
# 更新Homebrew
brew update

# 将Flutter应用安装到iOS设备需要一些工具
brew install --HEAD usbmuxd
brew link usbmuxd
brew install --HEAD libimobiledevice
brew install ideviceinstaller ios-deploy cocoapods
pod setup

# 出现问题 可执行brew doctor按照说明进行解决

# 使用xcode打开项目 配置项目签名等信息,也可以通过命令打开项目
open ios/Runner.xcworkspace

安卓开发环境设置:

  • 下载Android Studio,https://developer.android.com/studiohttps://developer.android.google.cn/studiohttps://developer.android.google.cn/studio/install
  • 执行Android Studio安装向导,这将安装最新的Android SDK,Android SDK平台工具和Android SDK构建工具;

运行Android模拟器:

  • 启动硬件加速
  • Tools-> Androids-> AVD Manager,选择Create Virtual Device
  • 在Emulated Performance下,选择Hardware - GLES2.0 以启动硬件加速(windows上,可以为Android SDK 启动 HAXM)
  • 在Android Virtual Device Manager中,点击工具栏Run
  • 通过flutter run运行启动项目

在配置了emulator相关环境变量之后,也可以通过命令启动模拟器:emulator -avd a81<模拟器名>

运行Android真机:

  • 开启 开发人员选项和USB调试;
  • 链接USB,进行授权;
  • 运行 flutter devices验证是否链接设备;
  • 运行flutter run

安装Flutter和Dart插件:

  • 打开Android Studio
  • Preferences -> Plugins(macOS上操作)
  • File-> Settings-> Plugins(Windows & Linux上操作)
  • 选择Browse repositories,搜索Flutter plugin、Dart插件,重启IDE;

环境准备好之后,项目创建和运行既可以用命令行方式,也可以使用IDE进行;关于项目的运行,可以使用flutter视角运行,也可以使用ios/android视角进行运行;

Flutter的快速上手

  • Dart基础
  • 声明时UI
  • Flutter基础
  • 项目结构、资源、依赖和本地化
  • 视图(Views)
  • 布局和列表
  • 状态管理
  • 路由与导航
  • 主题和文字处理
  • 线程和异步UI、Futures、async、await
  • 手势检测和触摸事件处理
  • 硬件调用,第三方交互
  • 表单输入和富文本
Dart

Dart中,每个app都必须有一个顶级main()函数,作为程序入口;

Dart语法类似js,只不过增加类类型声明,也是强类型语言,支持类型推断:

var name = null
String name = 'hello'
// 只有布尔类型的true才是true,并不是非零即为真;

// 运算符(左边为null时->阻断 赋默认值)
?. ??

// 函数声明
返回值类型 函数名(){
   }

// Futures 相当于 ES6中的Promise
HttpRequest.request(url).then((value){
   
  print(json.decode(value.responseText)['origin']);
}).catchError((error) => print(error));

// async 和 await
// js中async返回一个Promise,await用于等待Promise
// Dart中,async函数返回一个Future,函数主体稍后执行;await用于等待Future
_getIPAddress() async {
   
  var response = awart HttpRequest.request(url)
  ...
}
声明式UI
  • 之前熟悉的是手动构建全功能UI实体,UI响应时使用方法对其进行变更;
  • 为了减轻开发人员在各种UI状态之间转换的负担,Flutter支持描述UI状态,但不关心UI如何过渡到框架;
  • 声明式UI中,视图(Widgets)的配置是不可变的,并且是轻量级的蓝图;如果UI需要变更,Widgets会在自身上触发重建,比较常见的方式是通过Flutter中的StatefulWidgets调用setState(),并构造一个新的Widget子树;
return ViewB(
  color:red,
  child:ViewC(...)
)
  • 框架使用RenderObjects管理传统UI对象(如维护布局的状态);
    • RenderObjects在帧之间保持不变;
    • Flutter的轻量级Widget会在状态改变时,改变RenderObjects,其余部分会由Flutter框架进行处理;
Flutter入门
  • 如何创建Flutter项目、如何运行;
  • 如何导入Widget、HelloWorld、Widget树、重用Widget;
flutter create <projectname>
flutter run -d 'iPhone X'// 指定设备

// 使用Material Design,需导入material.dart包
import 'package:flutter/material.dart';
// 使用iOS样式的widget,导入Cupertino库
import 'package:flutter/cupertino.dart';
// 更基本的窗口widget,请导入widget库
import 'package:flutter/widgets.dart';
// 也可以导入自己编写的widget;
import 'package:flutter/my_widgets.dart';

具体导入包,也是按需导入的,Dart只会导入应用中使用的Widget;

注:该视频是基于Flutter1的,目前版本相关语法可能会有改变;

HelloWorld:

import 'package:flutter/material.dart';

void main(){
   
  runApp(
    // 根widget
    Center(
      child: Text(
        'Hello world',
        textDirection: TextDirection.ltr,
      )
    )
  )
}

Widget树:

  • Flutter中,几乎所有的东西都是Widget;它是用户界面构成的基本块;
  • 子widget会继承父widget的属性;应用程序本身也是一个组件,即根widget;

常用widget:

  • 结构元素:按钮、菜单
  • 文体元素:字体、颜色、主题
  • 布局:填充、对齐
import 'package:flutter/maretial.dart';

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

class MyApp extends StatelessWidget {
   
  @override
  Widget build(BuildContext context) {
   
    // 根widget
    return MeterialApp(
      title: 'Welcome to Flutter',
      home: Scaffold(// Scaffold 译为 脚手架
        appBar: AppBar(
          title: Text('Flutter'),
        ),
        body: Center(
          child: Text('Hello world'),
        )
      )
    )
  }
}

重用Widget:

// 自定义一个widget
class HQCustomCard extends StatelessWidget {
   
  HQCustomCard({
   
    @required this.index,
    @required this.actionOnPress
  });

  final index;
  final Function onPress;

  @override
  Widget build(BuildContext context) {
   
    return Card(
      child: Column(
        children:<Widget>[
          Text('Card $index'),
          FlatButton(
            child: const Text('Press'),
            onPressed: this.actionOnPress
          )
        ]
      )
    )
  }
}

// 使用
HQCustomCard(
  index: 1,
  onPress:() {
   
    print('something!');
  }
)

项目结构、资源、依赖和本地化
  • 项目文件结构
projectname
  android
  build // 构建输出目录
  ios
  lib // Dart源文件
    src
      ...
    main.dart // 入口文件
  test // 测试文件
  pubspec.yaml // 类似 vue的package.json 依赖项的配置文件

  • 图片资源和分辨率处理
    • 图片资源均作为assets处理,放在 assets 文件夹;
    • 该文件夹中可以放置任意类型文件,而不仅仅是图片,如json;

注:assets文件夹是放在哪个目录的?

答:Assets文件夹可以被放置任何目录,Flutter并未预先定义该文件结构,只需要在pubspec.yaml中声明assets的位置,flutter会进行识别;

// 放置资源后,在pubspec.yaml中声明assets
assets:
  - my-assets/data.json

// 使用示例
import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;

Future<String> loadAsset() async {
   
  // 使用bulndle加载资源
  return await rootBundle.loadString('my-assets/data.json');
}

对于图片,类似iOS,1x、2x、3x:

  • ldpi 0.75x
  • mdpi 1.0x
  • hdpi 1.5x
  • xhdpi 2.0x
  • xxhdpi 3.0x
  • xxxhdpi 4.0x
// 目录存放:
assets
  images/my_icon.png
  images/2.0x/my_icon.png
  images/3.0x/my_icon.png


// pubspec.yaml中声明
assets:
  - images/my_icon.png

// 访问,可借助AssetImage
return AssetImage("images/my_icon.png");
// 也可以通过Image widget直接使用:
return Image.asset("images/my_icon.png");

  • 归解档strings资源、多语言处理
    • 不像iOS拥有一个Localizable.strings文件,Flutter目前没有专门的字符串资源系统;
    • 目前最佳做法是将strings资源作为静态字段保存在类中;
class Strings {
   
  static String welcomeMessage = 'something';
}

// 使用
Text(Strings.welcomeMessage)

// 默认Flutter只支持英语,要支持其他语言,需引用 flutter_localizations包;
// 可能也需要引入 intl 包来支持其他的 i10n 机制,比如日期/时间格式化;
dependencies:
  # ...
  flutter_localizations:
    sdk: flutter
  intl: "^0.15.6"

// 要使用 flutter_localizations 包, 还需要在app widget中指定
// localizationsDelegates 和 supportedLocals
import 'package:flutter_localizations/flutter_localizations.dart';

MaterialApp(
  // 这些代理包含实际的本地化值
  localizationsDelegates: [
    // App app-specific localization delegate[s] here
    GlobalMeterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
  ],
  // 定义支持的地区
  supportedLocales: [
    const Locale('en', 'US') // English
    const Locale('he', 'IL') // Hebrew
    // ... other locals the app supports
  ],
  // ...
)

// 当初始化时,WidgetsApp或MaterialApp会使用指定代理创建一个 Localizations widget;
// Localization widget 可以随时从当前上下文中访问设备的地点,或者使用 Window.locale;


// 要访问本地化文件,使用Localizations.of() 方法访问提供代理的特定本地化类;
// 如需翻译,使用 intl_translation 包来取出翻译副本到 arb 文件中;把他们引入App中,并用 intl 来使用它们;(不使用 intl包也可以实现本地化)

  • 添加Flutter项目依赖(PubSite)
    • Android 在Gradle文件夹 添加依赖项
    • iOS 在Podfile中添加;
    • RN中,会在package.json中管理依赖
    • Flutter使用Dart构建系统和Pub包管理器来处理依赖;
    • pub get安装依赖

pubspec.yaml是Flutter 依赖项配置文件;Android 的Gradle和iOS的Podfile,只用来管理平台相关的依赖项;

视图Views

什么是View:

  • 概念上类似原生的UIView,但是Widget组成的View有些不同;
    • Widget具有不同的生命周期;
    • Widget是不可变的,状态一旦改变,Flutter会创建一个新的Widget实例树;
    • iOS的视图,在调用setNeedsDisplay之前都不会重绘;
    • Widget很轻巧,部分原因是它的不变性;因为它本身不是视图,并且不会直接绘制任何东西,而是对UI及语义的描述;

Flutter Widgets核心布局小部件,如Container Column Row Center;

如何更新Widgets:

  • iOS中,直接调用UIView实例的方法来进行UI控制;
  • 由于Widget不可变,Flutter会通过操纵Widget的状态来更新他们;
  • 对于StatelessWidgets适用于描述界面不依赖对象中配置信息的部件;
  • 如果需要根据网络请求结果或交互之后更新UI,则必须使用StatefulWidgets,并通知框架Widget已更新;
  • StatefulWidgets具有一个State对象,该对象存储状态数据并将其传递到树重建中;

Widget在build之外会改变的,即是有状态的;无状态组件、有状态组件可以相互包含;

import 'package:flutter/material.dart';

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

class SampleApp extends StatelessWidget {
   
  @override
  Widget build(BuildContext context) {
   
    return MaterialApp(
      title:'Sample App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SampleAppPage(),
    );
  }
}

class SampleAppPage extends StatefulWidget {
   
  SampleAppPage({
   Key key}) : super(key: key);

  @override
  _SampleAppPageState createState() => _SampleAppPageState();

}

class _SampleAppPageState extends State<SampleAppPage> {
   
  // placeholder
  String textToShow = "Flutter";

  void _updateText(){
   
    setState(() {
   
      textToShow = 'Hello';
    });
  }

  @override 
  Widget build(BuildContext context) {
   
    return Scaffold(
      appBar: AppBar(
        title: Text('App'),
      ),
      body: Center(child: Text(textToShow)),
      floatingActionButton:FloatingActionButton(
        onPressed: _updateText,
        tooltip: 'Update Text',
        child: Icon(Icons.update),
      )
    )
  }
}

如何布局:

  • Android 是 xml;iOS是xib约束布局;Flutter通过编写widget树来声明布局;
@override
Widget build(BuildContext context) {
   
  return Scafford(
    appBar: AppBar(
      title: Text("Sample App"),
    ),
    body: Center(
      child:MaterialButton(
        onPressed:() {
   },
        child: Text('Hello'),
        padding: EdgeInsets.only(left: 10.0, right: 10.0),
      )
    )
  )
}

布局中添加或删除组件:

  • Android addChild removeChild
  • iOS addSubview() removeFromSuperView()
  • Flutter:传入一个函数或表达式,返回值是一个给父项的Widget;并通过布尔值控制该Widget的创建;
import 'package:flutter/material.dart';

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

class SampleApp extends StatelessWidget {
   
  @override
  Widget build(BuildContext context) {
   
    return MaterialApp(
      title: "",
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SampleAppPage(),
    );
  }
}

class SampleAppPage extends StatefulWidget {
   
  SampleAppPage({
   Key key}) : super(key: key);

  @override
  _SampleAppPageState createState() => _SampleAppPageState();

}

class _SampleAppPageState extends State<SampleAppPage> {
   
  // placeholder
  bool toggle = true;

  void _toggle(){
   
    setState(() {
   
      toggle = !toggle;
    });
  }

  _getToggleChild() {
   
    if (toggle) {
   
      return Text('one');
    }else {
   
      return MaterialButton(
        onPressed: () {
   },
        child: Text('two')
      );
    }
  }

  @override 
  Widget build(BuildContext context) {
   
    return Scaffold(
      appBar: AppBar(
        title: Text('App'),
      ),
      body: Center(child: _getToggleChild),
      floatingActionButton:FloatingActionButton(
        onPressed: _toggle,
        tooltip: 'Update Text',
        child: Icon(Icons.update),
      )
    )
  }
}

如何对Widget做动画:

  • Android 通过XML创建动画或调用view.animate()
  • iOS,通过 animateWithDuration:animations:方法给view添加动画;
  • Flutter,使用动画库包裹widgets;

AnimationController:

  • 这是一个可以暂定、寻找、停止、反转动画的Animation类型;
  • 需要一个Ticker在vsync发生时发送信号,在每帧运行时创建一个介于0~1的线性插值(interpolation);
  • 可创建多个Animation附加给一个controller;

CurvedAnimation可以实现一个interpolated曲线:

  • controller是动画的主人,而CurvedAnimation计算曲线,并替代controller默认的线性模式;

当构件widget树时,可以吧Animation指定给一个widget的动画属性,比如FadeTransition的opacity属性,并告诉控制器开始动画;

import 'package:flutter/material.dart';

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

class FadeAppTest entends StatelessWidget {
   
  @override
  Widget build(BuildContext context) {
   
    return MaterialApp {
   
      title: 'Fade demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyFadeTest(title: 'Fade'),
    }
  }
}

class MyFadeTest extends StatefulWidget {
   
  MyFadeTest({
   Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyFadeTest createState() => _MyFadeTest();
}

class _MyFadeTest extends State<MyFadeTest> with TickerProviderStateMixin {
   
  AnimationController controller;
  CurveAnimation curve;

  @override
  void initState() {
   
    super.initState();
    controller = AnimationController(duration: const Duration(milliseconds: 2000), vsync: this);
    curve = CurveAnimation(parent: controller, curve: Curves.easeIn);
  }

  @override
  Widget build(BuildContext context) {
   
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Container(
          // 按钮淡入动画
          opacity: curve,
          child: FlutterLogo(
            size:100.0,
          )
        )
      ),
      floatingActionButton: FloatingActionButton(
        tooltip: 'Fade',
        child:Icon(Icons.brush),
        onPressed: () {
   
          controller.forward();
        }
      )
    )
  }
}



如何绘图(Canvas draw/paint):

  • Android Canvas与Drawable
  • iOS CoreGraphics
  • Flutter,提供的底层渲染引擎Skia,通过CustomPaintCustomPainter两个类帮助绘制画布;
// 画图
import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(home: DemoApp()));

class DemoApp extends StatelessWidget {
   
  Widget build(BuildContext context) => Scaffold(body: Signature());
}

class Signature extends StatefulWidget {
   
  SignatureState createState() => SignatureState();
}

class SignatureState extends State<Signature> {
   
  List<Offset> _points = <Offset>[];
  Widget build(BuildContext context) {
   
    return GestureDetector(
      onPanUpdate: (DragUpdateDetails details) {
   
        setState(() {
   
          RenderBox referenceBox = context.findRenderobject();
          Offset localPosition = referenceBox.globalToLocal(details.globalPosition);
          _points = List.from(_points)..add(localPosition);
        });
      },
      onPanEnd: (DragEndDetails details) => _points.add(null),
      child: CunstomPaint(painter: SignaturePainter(_points), size: Size.infinite),
    );
  }
}

class SignaturePainter extends CustomPainter {
   
  SignaturePainter(this.points);
  final List<Offset> points;

  void paint(Canvas canvas, Size size) {
   
    var paint = Paint()
      ..color = Colors.black
      ..StrokeCap = StrokeCap.round
      ..strokeWidth = 5.0;
    for (int i = 0; i < points.length - 1; i++) {
   
      if (points[i] != null && points[i + <
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter1.0入门基础 的相关文章

  • 如何从另一个块访问块状态中的数据

    我正在使用 Bloc 模式开发 Flutter 应用程序 认证成功后 UserSate就有了User对象 在所有其他 Bloc 中 我需要访问 UserState 中的 User 对象 我尝试在其他 Bloc 的构造函数参数上获取 User
  • 设置 stats_flutter 时间序列图表中时间标签的格式以包含 hh:mm:ss

    是否可以格式化charts flutter时间序列图表的x轴上的标签以进行显示hh mm ss 这个答案 https stackoverflow com a 51138909 1954993解释了如何格式化代码以显示月份和日期 但我需要显示
  • 如何在flutter中解析没有key的JSON

    我想解析一个 JSON 但这个 JSON 没有键值 仅仅是价值 我尝试创建课程但不起作用 错误是类型 List 不是类型 Map 的子类型 我尝试解析它们在 json 中占据的位置 例如 json 0 但我对此不确定 提前致谢 Json P
  • 如何使用新的流 API 在 Dart 中注册自定义事件

    我正在尝试注册 CustomEvent https developer mozilla org en US docs DOM Event CustomEvent https developer mozilla org en US docs
  • 如何在 flutter 中重用有状态的 widget

    我有一个以下状态完整小部件 我需要通过更改两个变量来重用它id and collectionName 一般来说 我会提取一个小部件 但在这种情况下 我正在修改变量firstName 这不会让我提取小部件 class IndividualSi
  • 在我的 angular-cli 项目中从 node-sass 切换到 dart sass

    我在 npm install 期间遇到了 node sass 做各种愚蠢的问题 包括但不限于 GNU c 编译一些东西 可能是它本身 尝试运行python2 7 尝试运行任何其他版本的 python 尝试连接到github 这在企业环境中造
  • 地理编码器 getFromLocation 失败

    我正在尝试从坐标中获取地标 我在用着geoLocator为了那个原因 今天早上工作正常 但现在抛出平台异常 PlatformException IO ERROR A network error occurred trying to look
  • 安装应用程序时创建文件夹

    如何在设备存储中创建文件夹来保存文件 这是将文件下载到设备的代码 import package flutter downloader flutter downloader dart onTap async ListTile attribut
  • Flutter get“类型'List '不是类型'Map '的子类型,类型转换错误

    网络服务器返回的结果如下 id 1 user id 10 title xxxxxxx description xxxx type post featured images slug xxxxxxxxx lang xx visit 0 cli
  • 堆栈小部件内的列表视图不起作用(scrollDirection:Axis.vertical)

    我需要做这个设计 This is my code result 但是当我添加列表视图时它不起作用我需要垂直列表而不是水平列表列表视图 builder 滚动方向 Axis vertical 收缩包装 真实 项目数量 12 itemBuilde
  • Flutter firebase_message 插件设置错误

    我想在我的 Flutter 应用程序中尝试云消息传递 但我总是遇到错误 而且我还没有找到解决方案 我按照此处所述的步骤进行操作 firebase 消息传递 https github com FirebaseExtended flutterf
  • 将数据模型存储到 Flutter Secure Storage 中

    我们如何将模型数据存储到 flutter 安全存储中 或者它支持吗 我有一个这样的模型 我将数据从我的 API 加载到这个模型 一旦我有了数据 我想将其保存到 flutter 安全存储中 反之亦然 将整个数据从 flutter 安全存储加载
  • 使用 Flutter 确认购买

    扑动的in app purchase插件已更新至版本0 3 0 将 Google Play 库迁移到2 0 3 根据 Google Play Library v2 所有购买都必须在 3 天内 测试订单为 5 分钟 内得到确认 否则将被自动取
  • 如何在 Flutter gold test 上检查字体文本

    我正在做一个package https pub dev packages mongol用于垂直蒙古文 我有一个自定义小部件 需要特殊字体才能显示 我正在尝试编写一个测试来显示蒙古文文本已正确呈现 在模拟器上看起来像这样 但黄金文件看起来像这
  • 在 Angular dart 上设置全局 Http 请求标头

    如何配置 Http 服务 向调用添加标头 我尝试以下方法 class GlobalHttpHeaders static setup Injector inj HttpDefaultHeaders http inj get HttpDefau
  • Flutter StatefulWidget 小部件和泛型

    如何将泛型类型传递给State of a StatefulWidget 在这里我想使用我的泛型myMethod
  • 如何为json可序列化对象设置默认值?

    我想设置一个默认值AvailableService 对于原语来说它足够简单 我将如何使用自定义对象来做到这一点 class Submenu extends Equatable JsonKey defaultValue final Strin
  • Flutter / Dart 和 AWS SDK [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在考虑用 Flutter 使用 dart 编写一个移动应用程序 然而 我大量使用 AWS 无法使用他们的 SDK 会很麻烦 有什么好的方
  • 如何在 Firebase 实时数据库上安排通知?

    我正在为我工 作的公司开发一个 flutter 通信应用程序 但我遇到了两个问题 这是我需要做的 1 向用户组或特定用户发送通知 并将这些通知保存在数据库或json文件中 该列表将作为 最新新闻 出现在我的应用程序的主屏幕上 问题是 当应用
  • 在 Google Dart 中使用游戏手柄

    我正在寻找代码示例Google Dart 的游戏手柄 API https api dartlang org apidocs channels be dart dom html Gamepad 我尝试直接依赖 API 文档并尝试为其编写一个实

随机推荐

  • 益智小游戏点灯(迷你世界lua脚本)

    点灯游戏是一个十分有趣的智力游戏 有一行N行N列的灯 开始时全部是灭的 当你点击其中一盏灯时他的上下左右 若存在的话 状态全部改变 现在要求你在限定的时间内以最少地步数 将全部的灯点亮 点灯益智游戏 作者 韩永旗 迷你号 247312290
  • Java基础读取本地txt文件

    public class TxtTest public static String txt2String File file StringBuilder result new StringBuilder try BufferedReader
  • python中冒号(:)的作用

    python中冒号 的作用 一开始接触python代码的时候冒号这个存在一直困扰了我很久 说一下我对冒号的理解 冒号 表示的就是一个整体 冒号出现在哪里就代表这个位置对整体 第一 作为整体用于输出 如在plt scatter x 0 x 1
  • 【Leetcode】142. 环形链表 II

    题目描述 142 环形链表 II 给定一个链表 返回链表开始入环的第一个节点 如果链表无环 则返回 null 为了表示给定链表中的环 我们使用整数 pos 来表示链表尾连接到链表中的位置 索引从 0 开始 如果 pos 是 1 则在该链表中
  • 海明校验码

    1 海明码的特点 其中m表示数据位的位数 k表示海明校验码的位数 k位海明校验码一共可以表示种校验信息结果 其中有一种要用来表示没有出错的情况 则其余还剩 1种结果 为了使校验结果可以指出任一位出错的位置 则需要满足以上不等式 2 举例说明
  • 树莓派搭建K8S集群

    最近学习k8s知识 想用树莓派搭建集群 在网找了不少 就发现一篇文章可以搭建成功香橙派4和树莓派4B构建K8S集群实践之一 K8S安装 参考了不少 这里主要记录下遇到的一些问题 参考的文章 是香橙派和树莓派 我这里全是树莓派 所以是树莓派路
  • js判断Android、iOS或浏览器

    第一种 通过判断浏览器的userAgent 用正则来判断是否是ios和Android客户端 代码如下
  • Python 八大排序算法合集

    1 选择排序 选择排序 升序 不稳定排序 原理 给定一个列表 经过第一轮比较后 找到最小值 与第一个位置交换 接着对不包括第一个元素的剩下的元素 找到最小值 与第二个位置交换 重复该过程 直到进行比较的记录只有一个为止 以 list 5 4
  • 关于STM32F0407译出错问题

    嵌入式编译出错问题 关于STM32F0407译出错问题 OBJ BEEP axf Error L6218E Undefined symbol TIM ClearITPendingBit referred from main o OBJ BE
  • Android系统开发之修改Captive Potal Service(消灭感叹号)

    本文原作者 长鸣鸟 未经同意 转载不带名的严重鄙视 谷歌在Android5 0之后的版本加入了CaptivePotalLogin服务 本服务的功能是检查网络连接互联网情况 主要针对于Wi Fi 不让Android设备自动连接那些不能联网的无
  • 查看应用程序依赖库

    1 ldd 如果是用x86架构编译的话 ldd可查看依赖的动态库 ldd a out linux vdso so 1 gt 0x00007fff13cd9000 libc so 6 gt lib x86 64 linux gnu libc
  • 不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列3 VR中的交互方式

    不知道怎么开发VR游戏 Unity5 3官方VR教程重磅登场 系列3 VR中的交互方式 王寒 4 个月前 https zhuanlan zhihu com p 20505470 概览 在VR项目中 我们需要在用户 凝视 某个物体时将其激活
  • h3c端口映射本地主机或服务器

    本地打开网站或服务器记住端口xxx 进入h3c服务器 进入内部服务器做端口映射 接口选择 wan口 使用当前外部IP 外部端口建议使用高数字端口YYYY 内部IP地址为服务器或网站所在的IP地址 内部端口为使用的端口xxx
  • chatgpt和copilot有关系吗

    chatgpt和copilot之间并没有直接的关系 chatgpt是一个开源的聊天机器人项目 是由谷歌开发的深度学习模型GPT 2 Generative Pre training Transformer 2 提供自然语言生成能力的一个实现
  • 学习笔记-Matlab算法篇-动态规划

    动态规划 01介绍 介绍 动态规划 dynamic programming 是运筹学的一个分支 是求解决策过程 decision process 最优化的数学方法 动态规划是求解某类问题的一种方法 是考察问题的一种途径 而不是一种特殊算法
  • weex实践初探

    weex是阿里2016年开源的项目 号称通过撰写HTML CSS JavaScript来开发原生android ios的UI界面 并且接近原生的性能体验 写一次 多端编译 一直是无线移动追求的目标 既然阿里牛皮吹得这么大 本人也非常迫切体验
  • EncodedResource类解读

    EncodedResource类解读 EncodedResource介绍 EncodedResource是spring中Resource编码相关的封装类 EncodedResource里面封装了一个Resource成员属性 其实主要功能就是
  • MySQL索引类型与索引原理

    1 索引类型 索引可以提升查询速度 会影响where查询 以及order by排序 MySQL索引类型如下 从索引存储结构划分 B Tree索引 Hash索引 FULLTEXT全文索引 R Tree索引 从应用层次划分 普通索引 唯一索引
  • Uncaught ReferenceError: xxx is not defined at HTMLInputElement.onclick已解决

    触发标签的onclick事件报错如下 Uncaught ReferenceError http is not defined at HTMLInputElement onclick list do pageType initialize 2
  • Flutter1.0入门基础

    Flutter1 0入门基础 注 原课程视频是基于Flutter1的 目标 开发入门 工具 环境搭建 入门必备 开发技巧 导航框架 常用功能 开发流程 网络 数据存储 列表 Flutter与Native混编 工程封装 模块开发 AI结合 项