flutter:总结所有需要用到的方法与实战 (十六)

简介: 本文介绍了Flutter中路由和顶部导航的使用方法,包括简单路由、命名路由、返回及返回根路由的实现。同时,详细讲解了顶部导航的定义与属性设置,并通过实战案例展示了复杂布局、新闻列表和页面制作的思路。最后,还提供了父类向子类传递参数的方法以及如何添加依赖库。

前言

在现代应用开发中,良好的路由管理和用户导航体验至关重要,Flutter 为开发者提供了强大的路由系统和灵活的导航方式。本文将深入介绍 Flutter 中路由和顶部导航的使用方法,包括简单路由、命名路由的设置,以及如何实现返回和返回根路由的功能。此外,我们将详细讲解顶部导航的定义与属性设置,并通过实战案例展示复杂布局、新闻列表及页面制作的思路

路由

简单使用

Navigator.push(context, MaterialPageRoute(builder: (context){
                return Successful();}))

命名路由

Navigator.of(context).pushNamed('new_page');

返回

Navigator.pop(context);

返回根路由

Navigator.of(context).pushReplacementNamed("/");

顶部导航

定义

穿件类时 需要在后面 加     with SingleTickerProviderStateMixin
    late TabController _tabController;
    super.initState();
    // 控制器
    _tabController = TabController(length: 5, vsync: this);
appBar: PreferredSize()
// 这些 都是在 appbar 下面的
// 导航条下
    elevation: 4,
      // 文字下面的宽度
        indicatorWeight: 2,
                            //  文字下面的长短 匹配方式
                  indicatorSize: TabBarIndicatorSize.label,
                                      //  不 被 选择 的颜色
                  unselectedLabelColor: Colors.black,      
                    //  指示器的颜色
                  indicatorColor: Colors.red,
                                  // 背景颜色
              backgroundColor: Colors.white,
                   tabs: const [
                    Tab(
                      child: Text("following"),
                    ),]
                          body: TabBarView(
          controller: _tabController,)

全部属性

borderRadius: BorderRadius.circular(10),
            boxShadow: [
              BoxShadow(color: Colors.black, blurRadius: 10),
            ],
    mainAxisSize: MainAxisSize.max,
      mainAxisSize: MainAxisSize.min,
        crossAxisAlignment:CrossAxisAlignment:.end   纵轴   Column
       main   主轴
          var a=  MediaQuery.of(context).size.width;
    mainAxisAlignment .end start  
       axis   horizon   vertical 
                                decoration: InputDecoration(
                            hintText: widget.hintLabel
                          ),
                                     barrierDismissible: false, //  点击 背景 不消失  默认 为 true

实战

复杂布局思路


一排导航

body: ListView(
        children: [
          Row(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Column(
                children: [
                  ClipOval(
                    child: Image.asset(
                      "imgs/laying.jpg",
                      height: 50,
                      width: 50,
                    ),
                  ),
                  Text("hello"),
                ],
              ),
              Column(
                children: [
                  ClipOval(
                    child: Image.asset(
                      "imgs/laying.jpg",
                      height: 50,
                      width: 50,
                    ),
                  ),
                  Text("hello"),
                ],
              ),
            ],
          )
        ],
      ),


新闻列表

body: ListView(
        children: [
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              Icon(
                Icons.settings_applications_sharp,
                size: 88.0,
              ),
              Container(
                margin: EdgeInsets.only(right: 180),
                child: Column(
                  children: [
                    Text("title"),
                    Text("content"),
                  ],
                ),
              ),
              Text("2020-1-1")
            ],
          ),
        ],
      ),

制作一个页面的思路

先制作 数据源 new   的时候 加 上  顿号就行

()

//在 vo 里面 创建  数据 源
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class ContactVO {
  late IconData icon;
  late String name;

  ContactVO(this.icon, this.name);
}

List<ContactVO> contactData = [
  new ContactVO(
    Icons.access_time_rounded,
    "clock",
  ),
  new ContactVO(
    Icons.backspace_outlined,
    "back",
  ),
  new ContactVO(
    Icons.tag_faces_sharp,
    "smile",
  )
];

在 定义一个组件  模板  用来  放数据

 final MessageData message;

里面 放 的值  都为 message 里面的

// 封装 一个 组件  用来 装 数据源
import 'package:flutter/material.dart';
import 'package:flutter03/contacts/contacts_vo.dart';

class ContactItem extends StatelessWidget {
  final ContactVO item;

  ContactItem({required this.item});

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 52.0,
      decoration: BoxDecoration(
        color: Colors.red,
        border: Border(bottom: BorderSide(width: 1, color: Colors.white)),
      ),
      child: ElevatedButton(
        onPressed: () {},
        child: Row(
          children: [
            Icon(item.icon),
            SizedBox(
              width: 40,
            ),
            Text(item.name),
          ],
        ),
      ),
    );
  }
}

之后  整合 使用

import 'dart:js_util';

import 'package:flutter/material.dart';

import 'contacts_item.dart';
import 'contacts_vo.dart';

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

  @override
  State<ContactPage> createState() => _ContactPageState();
}

class _ContactPageState extends State<ContactPage> {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView.builder(
          itemCount: contactData.length,
          itemBuilder: (BuildContext context, int index) {
            return ContactItem(
              item: contactData[index],
            );
          }),
    );
  }
}

父类的widget  给 子widget  传参

import 'package:flutter/material.dart';
class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);
  @override
  State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: test("this is message"),
      ),
    );
  }
}
class test extends StatefulWidget {
  final String message;
  test(this.message);
  @override
  State<test> createState() => _testState();
}
class _testState extends State<test> {
  bool _checkValue=true;
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Row(
        children: [
          Checkbox(value: _checkValue, onChanged: (v){
            this.setState(() {
              _checkValue= v!;
            });
          }),
          Text(  this.widget.message,)
        ],
      ),
    );
  }
}

添加依赖

fluttertoast: ^8.2.2
import 'package:fluttertoast/fluttertoast.dart';
相关文章
|
2月前
|
Dart Android开发
鸿蒙Flutter实战:05-使用第三方插件
在鸿蒙Flutter开发中,使用原生功能需借助插件。可自编原生ArkTS代码或采用第三方插件。自编代码通过PlatformView或MethodChannel实现;第三方插件需确保适配鸿蒙,否则须配置替代插件或自行开发。
78 1
鸿蒙Flutter实战:05-使用第三方插件
|
2月前
|
Java 开发工具
鸿蒙Flutter实战:02-Windows环境搭建踩坑指南
本指南介绍如何搭建鸿蒙Flutter开发环境,包括下载Flutter SDK、配置环境变量(如FLUTTER_STORAGE_BASE_URL、PUB_HOSTED_URL、DEVECO_SDK_HOME等)和检查工具版本。还提到避免项目路径过深、与SDK同盘存放等注意事项,以及解决VsCode无法识别设备的方法。
52 0
|
22天前
|
存储 调度 数据安全/隐私保护
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
鸿蒙应用打包上架流程包括创建应用、打包签名和上传应用。首先,在AppGallery Connect中创建项目、APP ID和元服务。接着,使用Deveco进行手动签名,生成.p12和.csr文件,并在AppGallery Connect中上传CSR文件获取证书。最后,配置签名并打包生成.app文件,上传至应用市场。常见问题包括检查签名配置文件是否正确。参考资料:[应用/服务签名](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-signing-V5)。
52 3
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
|
22天前
|
开发工具 芯片 开发者
鸿蒙Flutter实战:12-使用模拟器开发调试
本文介绍了如何在 M 系列芯片的 Mac 电脑上使用模拟器进行鸿蒙 Flutter 开发和调试。主要内容包括:创建 Flutter 项目、签名、创建模拟器、运行 Flutter 项目以及常见问题的解决方法。适用于希望在鸿蒙系统上开发 Flutter 应用的开发者。
40 2
鸿蒙Flutter实战:12-使用模拟器开发调试
|
28天前
|
IDE 开发工具
鸿蒙Flutter实战:11-使用 Flutter SDK 3.22.0
本文介绍了如何使用 Flutter SDK 3.22.0 搭建鸿蒙开发环境。首先安装 Flutter SDK 3.22.0,并通过 FVM 管理多个版本。接着配置项目,使用 `fvm use custom_3.22.0` 设置自定义 SDK 版本。添加鸿蒙平台支持并进行项目签名,最后通过 `fvm flutter run` 运行项目。详细步骤包括安装、项目配置、签名和运行,确保开发环境顺利搭建。
72 7
鸿蒙Flutter实战:11-使用 Flutter SDK 3.22.0
|
28天前
|
UED
<大厂实战经验> Flutter&鸿蒙next 中使用 initState 和 mounted 处理异步请求的详细解析
在 Flutter 开发中,处理异步请求是常见需求。本文详细介绍了如何在 `initState` 中触发异步请求,并使用 `mounted` 属性确保在适当时机更新 UI。通过示例代码,展示了如何安全地进行异步操作和处理异常,避免在组件卸载后更新 UI 的问题。希望本文能帮助你更好地理解和应用 Flutter 中的异步处理。
64 3
|
28天前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
104 1
|
2月前
|
开发者
鸿蒙Flutter实战:07-混合开发
鸿蒙Flutter混合开发支持两种模式:1) 基于har包,便于主项目开发者无需关心Flutter细节,但不支持热重载;2) 基于源码依赖,利于代码维护与热重载,需配置Flutter环境。项目结构包括AppScope、flutter_module等目录,适用于不同开发需求。
80 3
|
2月前
|
Web App开发 JavaScript 前端开发
鸿蒙Flutter实战:04-如何使用DevTools调试Webview
本文介绍如何在鸿蒙 Flutter 开发中调试 Webview,包括配置允许调试、找到 devtools 端口、开启端口转发、在 Chrome 中调试 Webview等。
31 0
鸿蒙Flutter实战:04-如何使用DevTools调试Webview
|
2月前
|
开发工具 Android开发 git
鸿蒙Flutter实战:01-搭建开发环境
本文介绍了如何搭建鸿蒙 Flutter 开发环境,包括安装 DevEco Studio 等工具,并详细说明了 Mac 和 Windows 系统下的环境变量配置。此外,还介绍了如何使用 FVM 管理多个 Flutter 版本,并提供了一些常见问题的解决方案和交流群信息。
106 0
鸿蒙Flutter实战:01-搭建开发环境