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';
相关文章
|
开发者
Flutter笔记:build方法、构建上下文BuildContext解析
本文主要介绍Flutter中的build方法和构建上下文对象。
358 2
Flutter笔记:build方法、构建上下文BuildContext解析
带你读《深入浅出Dart》三十、Flutter实战之TODO应用(1)
带你读《深入浅出Dart》三十、Flutter实战之TODO应用(1)
带你读《深入浅出Dart》三十、Flutter实战之TODO应用(2)
带你读《深入浅出Dart》三十、Flutter实战之TODO应用(2)
Flutter Getx 路由 until 方法帮助你跳转指定路由
不少同学都会问我,这样一个场景,当我点击商品列表,进入商品页,点击购买,支付成功后,想返回商品页,或者我的中心的订单列表。怎么做,这中间跨度了 n 个路由。 我不只一次的推荐 GetX 的 until 方法,和 offNamedUntil 方法。 我写了个 demo 今天我们就一起来看下这两个方法如何使用。
1504 0
Flutter Getx 路由 until 方法帮助你跳转指定路由
|
4月前
|
存储 开发框架 JavaScript
深入探讨Flutter中动态UI构建的原理、方法以及数据驱动视图的实现技巧
【6月更文挑战第11天】Flutter是高效的跨平台移动开发框架,以其热重载、高性能渲染和丰富组件库著称。本文探讨了Flutter中动态UI构建原理与数据驱动视图的实现。动态UI基于Widget树模型,状态变化触发UI更新。状态管理是关键,Flutter提供StatefulWidget、Provider、Redux等方式。使用ListView等可滚动组件和StreamBuilder等流式组件实现数据驱动视图的自动更新。响应式布局确保UI在不同设备上的适应性。Flutter为开发者构建动态、用户友好的界面提供了强大支持。
85 2
|
5月前
|
前端开发 C++ 容器
Flutter-完整开发实战详解(一、Dart-语言和-Flutter-基础)(1)
Flutter-完整开发实战详解(一、Dart-语言和-Flutter-基础)(1)
|
3月前
Flutter生命周期方法小技巧
Flutter生命周期方法小技巧
24 0
|
5月前
|
Dart Android开发 iOS开发
Flutter 弃用 WillPopScope 使用 PopScope 替代方法
了解如何在 Flutter 3.16 中将弃用的 WillPopScope 替换为 PopScope,并学习如何升级您的 Flutter 应用程序。详细指南和最佳实践,帮助您顺利迁移和更新您的导航逻辑。
223 7
Flutter 弃用 WillPopScope 使用 PopScope 替代方法
|
5月前
|
Android开发
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
|
5月前
|
存储 前端开发
Flutter Provider状态管理---MVVM架构实战
Flutter Provider状态管理—MVVM架构实战 在Flutter中,状态管理是一个非常重要的概念。Flutter Provider是一种状态管理的解决方案,它提供了一种简单,灵活和高效的方法来管理Flutter应用程序中的状态。本文将详细介绍Flutter Provider的使用,以及如何在MVVM架构中使用它。
341 0