ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Flutter学习指南:编写第一个应用,5G音视频时代还不学NDK开发吗

2022-01-24 15:33:47  阅读:254  来源: 互联网

标签:学习指南 widget return onPressed NDK 音视频 State context Flutter


编写代码(1)

在上一小节里我们所创建的项目,已经有了一些代码,感兴趣的读者可以跑到自己手机上看一看,相关的代码在 lib/main.dart 里面。

为了体验从头开发一个应用的过程,这里我们先把 lib/main.dart 里的内容都删除。

首先,创建一个 main 函数。跟其他语言一样,main 函数是应用的入口:

void main() {
}

下面我们编写一个 Widget 作为我们的 app。在 Flutter 里,所有的东西都是 Widget

import ‘package:flutter/material.dart’;
void main() {  
// 创建一个 MyApp
runApp(MyApp());
}
/// 这个 widget 作用这个应用的顶层 widget.
///
/// 这个 widget 是无状态的,所以我们继承的是 [StatelessWidget].
/// 对应的,有状态的 widget 可以继承 [StatefulWidget]
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) { 
// 创建内容
}
}

现在我们进入正题,实现一个按钮,在点击的时候弹框显示结果:

@override
Widget build(BuildContext context) {
// 我们想使用 material 风格的应用,所以这里用 MaterialApp
return MaterialApp(
// 移动设备使用这个 title 来表示我们的应用。具体一点说,在 Android 设备里,我们点击
// recent 按钮打开最近应用列表的时候,显示的就是这个 title。
title: ‘Our first Flutter app’,
// 应用的“主页” 
home: Scaffold(
appBar: AppBar(
title: Text(‘Flutter rolling demo’), 
), 
// 我们知道,Flutter 里所有的东西都是 widget。为了把按钮放在屏幕的中央,
// 这里使用了 Center(它是一个 widget)。
body: Center( 
child: RaisedButton(  
// 用户点击时候调用
onPressed: _onPressed, 
child: Text(‘roll’),
),
),
),
);
}
void _onPressed() {
// TODO
}

安装、调试(1)

现在,点击 Run,把我们的第一个 Flutter 应用跑起来吧。没有意外的话,你会看到下面这个页面:

image.png

如果你遇到了什么困难,可以查看 tag first_app_step1 的代码:

git clone https://github.com/Jekton/flutter_demo.git
cd flutter_demo
git checkout first_app_step1

由于是第一次写 Flutter 应用,我们对上面的代码是否能够按照预期执行还不是那么有信心,所以我们先打个 log 确认一下,点击按钮后是不是真的会执行 onPress

打 log 可以使用 Dart 提供的 print,但在日志比较多的时候,print 的输出可能会被 Android 丢弃,这个时候 debugPrint 会是更好的选择。对应的日志信息可以在 Dart Console 里查看(View -> Tool Windows -> Run 或者 Mac 上使用 Command+4 打开)。

void _onPressed() {
debugPrint(’_onPressed’);
}

保存后(会自动 Hot Reload),我们再次点击按钮,在我的设备上,打印出了下面这样的信息:

I/flutter (11297): _onPressed
V/AudioManager(11297): playSoundEffect   effectType: 0
V/AudioManager(11297): querySoundEffectsEnabled…

这里的第一行,就是我们打的。现在我们有足够的自信说,点击按钮后,会执行 _onPressed 方法了。

编写代码(2)

软件开发通常是一个螺旋式上升的过程,不可能通过一次编码、调试就完成。现在,我们开始第二轮迭代。

接下来要做的,便是在 _onPressed 里面弹一个框:

// context 这里使用的是 MyApp.build 的参数
void _onPressed(BuildContext context) {
debugPrint('onPressed’);
showDialog(
context: context,
builder: (
) {
return AlertDialog(
content: Text(‘AlertDialog’),
);
}
);
}

遗憾的是,这一次并不那么顺利。Dialog 没有弹出来,而且报了下面这问题:

I/flutter (11297): Navigator operation requested with a context that does not include a Navigator.
I/flutter (11297): The context used
 to push or pop routes from the Navigator must be that of a widget that is a
I/flutter (11297): descendant of a Navigator widget.

原因在于,stateless 的 widget 只能用于显示信息,不能有其他动作。所以,该让 StatefulWidget 上场了。

class RollingButton extends StatefulWidget {
// StatefulWidget 需要实现这个方法,返回一个 State
@override
State createState() {
return _RollingState();
}
}
// 可能看起来有点恶心,这里的泛型参数居然是 RollingButton
class _RollingState extends State {
@override
Widget build(BuildContext context) {
return RaisedButton(
child: Text(‘Roll’),
onPressed: _onPressed,
);
}
void _onPressed() {
debugPrint(’_RollingState.onPressed’);
showDialog(
// 第一个 context 是参数名,第二个 context 是 State 的成员变量
context: context,
builder: (
) {
return AlertDialog(
content: Text(‘AlertDialog’),
);
}
);
}
}

要实现一个 stateful 的 widget,可以继承 StatefulWidget 并在 createState 方法中返回一个 State。除了这一部分,代码跟我们之前写的并没有太大的区别。

剩下的,就是替换 MyApp 里面使用的按钮,修改后的代码如下:

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: ‘Our first Flutter app’,
home: Scaffold(
appBar: AppBar(
title: Text(‘Flutter rolling demo’),
),
body: Center(
child: RollingButton(),
),
),
);
}
}

再次运行,点击按钮后,我们将看到梦寐以求的 dialog。

image.png

如果你遇到了麻烦,可以查看 tag first_app_step2 的代码。

最后,我们来实现“roll”:

import ‘dart:math’;
class _RollingState extends State {
final _random = Random();
// …
List _roll() {
final roll1 = _random.nextInt(6) + 1;
final roll2 = _random.nextInt(6) + 1;
return [roll1, roll1];
}
void _onPressed() {
debugPrint(’_RollingState._onPressed’);
final rollResults = roll();
showDialog(
// 第一个 context 是参数名,第二个 context 是 State 的成员变量
context: context,
builder: (
) {
return AlertDialog(
content: Text(‘Roll result: ( r o l l R e s u l t s [ 0 ] ,   {rollResults[0]},  rollResults[0], {rollResults[1]})’),
);
}
);
}
}

s = roll();
showDialog(
// 第一个 context 是参数名,第二个 context 是 State 的成员变量
context: context,
builder: (
) {
return AlertDialog(
content: Text(‘Roll result: ( r o l l R e s u l t s [ 0 ] ,   {rollResults[0]},  rollResults[0], {rollResults[1]})’),
);
}
);
}
}

标签:学习指南,widget,return,onPressed,NDK,音视频,State,context,Flutter
来源: https://blog.csdn.net/m0_66264533/article/details/122668238

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有