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';
相关文章
|
12月前
|
Dart Android开发
鸿蒙Flutter实战:05-使用第三方插件
在鸿蒙Flutter开发中,使用原生功能需借助插件。可自编原生ArkTS代码或采用第三方插件。自编代码通过PlatformView或MethodChannel实现;第三方插件需确保适配鸿蒙,否则须配置替代插件或自行开发。
378 1
鸿蒙Flutter实战:05-使用第三方插件
|
5月前
|
API Android开发 iOS开发
除了permission_handler插件,还有哪些方法可以实现Flutter动态申请权限?
除了permission_handler插件,还有哪些方法可以实现Flutter动态申请权限?
315 68
|
3月前
|
前端开发 Java 开发者
SpringBoot 3 + Flutter3 实战低代码运营管理
Spring Boot 3 与 Flutter 3 强强联合,助力现代 Web 与移动应用开发。Spring Boot 3 提升后端开发效率,支持最新 Java 特性;Flutter 3 实现跨平台高性能 UI,热重载加速前端迭代。两者结合打造高效、可扩展的应用开发新体验。
128 0
|
6月前
|
机器学习/深度学习 JSON 自然语言处理
Flutter敏感词过滤实战:基于AC自动机的高效解决方案
在社交、直播等场景中,敏感词过滤至关重要。本文介绍基于AC自动机的Flutter高效敏感词过滤方案,通过构建Trie树与失败指针实现线性时间复杂度的多模式匹配,支持干扰字符处理与动态优化。代码实战结合性能对比,助你打造毫秒级响应的过滤系统,适用于聊天、评论、内容审核等场景,保障平台安全。
333 69
|
10月前
|
Dart 前端开发 IDE
鸿蒙Flutter实战:14-现有Flutter 项目支持鸿蒙 II
本文介绍了如何将现有 Flutter 项目适配鸿蒙系统,详细步骤包括安装 FVM、使用 FVM 安装 Flutter SDK、搭建开发环境、创建项目架构和壳工程等。
856 7
鸿蒙Flutter实战:14-现有Flutter 项目支持鸿蒙 II
|
11月前
|
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` 运行项目。详细步骤包括安装、项目配置、签名和运行,确保开发环境顺利搭建。
581 7
鸿蒙Flutter实战:11-使用 Flutter SDK 3.22.0
|
11月前
|
存储 调度 数据安全/隐私保护
鸿蒙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)。
571 3
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
|
11月前
|
开发工具 芯片 开发者
鸿蒙Flutter实战:12-使用模拟器开发调试
本文介绍了如何在 M 系列芯片的 Mac 电脑上使用模拟器进行鸿蒙 Flutter 开发和调试。主要内容包括:创建 Flutter 项目、签名、创建模拟器、运行 Flutter 项目以及常见问题的解决方法。适用于希望在鸿蒙系统上开发 Flutter 应用的开发者。
372 2
鸿蒙Flutter实战:12-使用模拟器开发调试
|
11月前
|
开发框架 前端开发 定位技术
Flutter框架中的插件市场及开源资源的利用方法。内容涵盖插件市场的扩展功能、时间节省与质量保证
本文深入探讨了Flutter框架中的插件市场及开源资源的利用方法。内容涵盖插件市场的扩展功能、时间节省与质量保证,常见插件市场的介绍,选择合适插件的策略,以及开源资源的利用价值与注意事项。通过案例分析和对社区影响的讨论,展示了这些资源如何促进开发效率和技术进步,并展望了未来的发展趋势。
228 11
|
11月前
|
缓存 前端开发 数据安全/隐私保护
Flutter 框架提供了丰富的机制和方法来优化键盘处理和输入框体验
在移动应用开发中,Flutter 框架提供了丰富的机制和方法来优化键盘处理和输入框体验。本文深入探讨了键盘的显示与隐藏、输入框的焦点管理、键盘类型的适配、输入框高度自适应、键盘遮挡问题处理及性能优化等关键技术,结合实例分析,旨在帮助开发者提升应用的用户体验。
451 6

热门文章

最新文章

  • 1
    flutter3-wetrip跨平台自研仿携程app预约酒店系统模板
    225
  • 2
    通过外部链接启动 Flutter App(详细介绍及示例)
    295
  • 3
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    854
  • 4
    零基础构建即时通讯开源项目OpenIM移动端-Flutter篇
    468
  • 5
    flutter3-dart3-dymall原创仿抖音(直播+短视频+聊天)商城app系统模板
    277
  • 6
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    410
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    199
  • 8
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    214
  • 9
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    466
  • 10
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    249