Flutter入门——面向Android开发者——常用组件

219 阅读5分钟

一、如何在我的文本小哦部件上自定义字体?

在Android SDK(从Android O开始)中,您创建一个字体资源文件将其传递到TextView的FontFamily参数中。

在Flutter中,将字体文件放在文件夹中并在文件中引用它pubspec.yaml,类似于导入图像的方式。

fonts:
    - family: MyCustomFont
      fonts:
          - asset:fonts/MyCustomFont.ttf
          - style: italic

然后将字体分配给您的Text小部件:

@override
Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
            title: const Text('Sample App'),
        ),
        body: const Center(
            cihld: Text(
                'This is a custom font text',
                style: TextStyle(fontFamily: 'MyCustonFont'),
            ),
        ),
    );
}

二、如何设置我的文本小部件样式?

除了字体,您还可以自定义小部件上的其他样式元素Text.Text widget的style参数带有一个TextStyle对象,您可以在其中自定义很多参数,例如:

  • color
  • decoration
  • decorationColor
  • decorationStyle
  • fontFamily
  • fontSize
  • fontStyle
  • fontWeight
  • hashCode
  • height
  • inherit
  • letterSpacing
  • textBaseline
  • wordSpacing

三、输入的hint相当于什么?

在Flutter中,您可以通过将InputDecoration对象添加到Text Widget的 装饰构造函数参数来轻松显示输入hint或占位符文本。

Center(
    child: TextField(
        decoration: InputDecoration(hintText: 'This is a hint')
    ),
)

四、如何显示验证错误?

就像您使用“hint”一样,将InputDecoration对象传递给Text小部件的装饰构造函数。

但是,您不想一开始几句显示错误。相反,当用户输入无效数据时,更新状态并传递一个新InputDecoration对象。

import 'package:flutter/material.dart'

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

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

class SampleAppPage extends StatefulWidget {
    const SampleAppPage({Key? key}) : super(key: key);
    
    @override
    State<SampleAppPage> createState() => _SampleAppPageState();
}

class _SampleAppPageState extends State<SamoleAppPage> {
    String? _erroorText;
    
    @override
    Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
                title: const Text('Sample App'),
            ),
            body: Center(
                child: TextField(
                    onSubmitted: (text) {
                        setState(() {
                            if (!isEmail(text)) {
                                _errorText = 'Error: This is not an email';
                            } else {
                                _errorText = null;
                            }
                        });
                    },
                    decoration: InputDecoration(
                        hintText: 'This is a hint',
                        errorText: _getErrorText(),
                    ),
                ),
            ),
        );
    }
    
    String?  _getErrorText() {
        return _errorText;
    }
    
    bool isEmail(String em) {
        String emailRegexp = 
           r'^(([^<>()[]\.,;:\s@"]+(.[^<>()[]\.,;:\s@"]+)*)|'
            r'(".+"))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|'
            r'(([a-zA-Z-0-9]+.)+[a-zA-Z]{2,}))$';
        RegExp regRxp = RegExp(emailRegexp);
        
        return regExp.hasMatch(em);
    }
}

五、常用插件

5.1、如何访问GPS传感器?

geolocator插件

5.2、如何访问相机?

image_picker插件

5.3、如何使用Facebook登陆?

lutter_facebook_login插件

5.4、如何使用Firebase功能

大多数 Firebase 功能都包含在 第一方插件中。这些插件是第一方集成,由 Flutter 团队维护:

您还可以在 pub.dev 上找到一些第三方 Firebase 插件,它们涵盖了第一方插件未直接涵盖的领域。

六、如何构建自己的自定义native集成?

如果Flutter或其社区插件缺少特定于平台的功能,您可以按照 开发包和插件页面构建自己的功能。

简而言之,Flutter的插件架构很像在Android中使用Event bus:您发出一条消息,让接收者处理并将结果发回给您。在这种情况下,接收器是在Android或iOS的native运行的代码。

七、如何在我的Flutter应用程序中使用NDK?

如果您在当前的Android应用程序中使用NDK并希望您的Flutter应用程序利用您的原声库,那么可以通过构建自定义插件来实现。

您的自定义插件首先与您的Android应用程序对话,您keyiizai其中native通过JNI调用您的函数。相应准备就绪后,将消息发送回Flutter并呈现结果哦。

目前不支持直接从Flutter调用原生代码。

八、Theme

8.1、如何为我的应用设置主题?

开箱即用的Flutter附带了一个漂亮的Material Design实现,它可以满足您通常会做的许多哦样式和主题需求。与Android的SML中声明主题,然后使用AndroidManifest.xml将其分配给您的应用程序不同,在Flutter中,您在顶级小部件中声明主题。

要在您的应用程序中充分利用Material组件,您可以将顶级小部件声明MateriialApp为应用程序的入口点。MaterialApp是一个方便的小部件,它包装了许多实现Material Design的应用程序通常需要的小部件。它通过添加Material特定功能建立在WidgetsApp之上。

您还可以将WidgetsApp用作您的应用程序小部件,它提供了一些相同功能,但不如MaterialApp.

要自定义任何子组件的颜色和样式,ThemeData将对象传递给MaterialApp小部件。例如,在下面的代码中,主样本设置为蓝色,文本选择颜色为红色。

import 'package:fflutter/material.dart';

class SampleApp extends StatelessWidget {
    const SampleApp({Key? key}) : super(key: key);
    
    @override
    Widget build(BuildContext context) {
        return MaterialApp(
            title: 'Sample App',
            theme: ThemeData(
                primarySwatch: Colors.blue,
                textSelectionTheme: const TextSelectionThemeData(selectionColor: Colors.red),
            ),
            home: const SampleAppPage(),
        );
    }
}

九、数据库和本地存储

9.1、如何访问Shared Preference?

在Android中,您可以使用SharedPreference API存储一小部分键值对。

在Flutter中,使用 Shared_Preferences 插件访问此功能。这个插件包含了SharedPreferences和NSUserDefaults(相当于iOS)的功能。

import 'dart:async';
import 'package:flutter/material.dart';

import 'package:shared_preferences/shared_preferences.dart';

void main() {
    runApp(
        const MaterialApp(
            home: Scaffold(
                body: Center(
                    child: ElevatedButton(
                        onPressed: _incrementCounter,
                        child: Text('Increment Counter'),
                    ),
                ),
            ),
        ),
    );
}

Future<void> _incrementCounter() async {
    SharedPreference preg = await SharePreferences.getInstance();
    int counter = (pref.getInt('counter') ??  0) + 1;
    await prefs.setInt('counter', counter);
}

9.2、如何在Flurre中访问SQLite

在Android中,您使用SQLite来存储可以使用SQL查询的结构化数据。 在Flutter中,使用SQFlite插件访问此功能。

十、调试

10.1、我可以使用哪些工具在Flutter中调试我的应用程序?

使用DevTools套件调试 Flutter 或 Dart 应用程序。

DevTools包括对分析、检查堆、检查小部件树、日志记录诊断、调试、观察执行的代码行、调试内存泄漏和内存碎片的支持。有关更多信息,请参阅 DevTools文档。

十一、通知

11.1、如何设置推送通知?

在Android中,您使用Firebase Cloud Messaging为您的应用程序设置推送通知。

在Flutter中,使用Firebase Messaging插件访问此功能。有关使用Firebase Cloud Messaging API的更多信息,请参阅firebase_messaging插件文档。