最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Flutter組件狀態(tài)管理的3種方法

 更新時間:2022年03月24日 10:23:52   作者:武器大師72  
這篇文章主要為大家詳細介紹了Flutter組件狀態(tài)管理的3種方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言

前面講了Flutter布局,布局只是靜態(tài)的。在Flutter中,組件分為StatelesslWidget和StatefulWidget。

  • StatelesslWidget

沒有狀態(tài),是一成不變的。比如圖標,文字,按鈕等

  • StatefulWidget

有狀態(tài)的組件,頁面數(shù)據(jù)是動態(tài)的,或者會隨著用戶操作變化,比如多選框,文本輸入框等。

有狀態(tài)組件

重點來了,如何使用實現(xiàn)一個有狀態(tài)的組件呢?

  • 有狀態(tài)的組件一般由兩個類構成,一個StatefulWidget子類和一個State子類.
  • State類包含了組件的build()方法,并且負責維護組件狀態(tài)
  • 當這個組件的狀態(tài)變化了,可以調(diào)用setState()方法來刷新頁面

狀態(tài)管理

由誰來負責狀態(tài)管理呢?是組件本身,還是他的父類,兩者都有又或是其他對象?答案是都可以。也就是說有三種方法實現(xiàn)狀態(tài)管理:

1.組件自己管理自己的狀態(tài)
2.組件的父組件管理狀態(tài)
3.混搭管理

那么如何決定該用那種方式來進行狀態(tài)管理呢?一般來講有以下原則:

1.如果是用戶數(shù)據(jù),比如多選框是否被選中,一般是由選擇第2種方法
2.如果動效,比如放大縮小,那一般用第1種方法

PS:如果你實在迷芒,就直接選擇用第2種方法,用父類管理狀態(tài)。

舉例

組件自己管理自己的狀態(tài)

如下代碼:_TapboxAState這個State子類為TapboxA維護狀態(tài),內(nèi)部定義了一個_active變量來決定當前是否為激活的狀態(tài),內(nèi)部還定義了一個_handleTap()回調(diào)函數(shù),來處理用戶點擊后的邏輯,并且調(diào)用了setState()生命周期方法,重新刷新頁面。

import 'package:flutter/material.dart';

// TapboxA 自己管理狀態(tài)
void main() => runApp(const MyApp());
//------------------------- TapboxA ----------------------------------

class TapboxA extends StatefulWidget {
? const TapboxA({Key? key}) : super(key: key);
? @override
? _TapboxAState createState() => _TapboxAState();
}

class _TapboxAState extends State<TapboxA> {
? bool _active = false;

? void _handleTap() {
? ? setState(() {
? ? ? _active = !_active;
? ? });
? }
??
? @override
? Widget build(BuildContext context) {
? ? return GestureDetector(
? ? ? onTap: _handleTap,
? ? ? child: Container(
? ? ? ? child: Center(
? ? ? ? ? child: Text(
? ? ? ? ? ? _active ? 'Active' : 'Inactive',
? ? ? ? ? ? style: const TextStyle(fontSize: 32.0, color: Colors.white),
? ? ? ? ? ),
? ? ? ? ),
? ? ? ? width: 200.0,
? ? ? ? height: 200.0,
? ? ? ? decoration: BoxDecoration(
? ? ? ? ? color: _active ? Colors.lightGreen[700] : Colors.grey[600],
? ? ? ? ),
? ? ? ),
? ? );
? }
}

//------------------------- MyApp ----------------------------------

class MyApp extends StatelessWidget {
? const MyApp({Key? key}) : super(key: key);

? @override
? Widget build(BuildContext context) {
? ? return MaterialApp(
? ? ? title: 'Flutter Demo',
? ? ? home: Scaffold(
? ? ? ? appBar: AppBar(
? ? ? ? ? title: const Text('Flutter Demo'),
? ? ? ? ),
? ? ? ? body: const Center(
? ? ? ? ? child: TapboxA(),
? ? ? ? ),
? ? ? ),
? ? );
? }
}

父組件管理狀態(tài)

更多時候我們需要父組件來決定子組件什么時候來更新狀態(tài),子組件只需要根據(jù)父組件傳過來的參數(shù)進行合理的展示即可。這種情況下子組件并不需要維護狀態(tài),所以子組件是一個StatelessWidget,父組件ParentWidget才是StatefulWidget。代碼如下:
父組件維護了一個_active變量用來標記是否為激活狀態(tài),并且實現(xiàn)了回調(diào)函數(shù)_handleTapboxChanged用來反轉激活狀態(tài),供子組件調(diào)用。子組件TapboxB是一個無狀態(tài)組件,只需要在被點擊的時候通知父組件來管理狀態(tài)。

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());


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

? @override
? _ParentWidgetState createState() => _ParentWidgetState();
}

class _ParentWidgetState extends State<ParentWidget> {
? bool _active = false;

? void _handleTapboxChanged(bool newValue) {
? ? setState(() {
? ? ? _active = newValue;
? ? });
? }

? @override
? Widget build(BuildContext context) {
? ? return SizedBox(
? ? ? child: TapboxB(
? ? ? ? active: _active,
? ? ? ? onChanged: _handleTapboxChanged,
? ? ? ),
? ? );
? }
}

//------------------------- TapboxB ----------------------------------

class TapboxB extends StatelessWidget {
? const TapboxB({
? ? Key? key,
? ? this.active = false,
? ? required this.onChanged,
? }) : super(key: key);

? final bool active;
? final ValueChanged<bool> onChanged;

? void _handleTap() {
? ? onChanged(!active);
? }

? @override
? Widget build(BuildContext context) {
? ? return GestureDetector(
? ? ? onTap: _handleTap,
? ? ? child: Container(
? ? ? ? child: Center(
? ? ? ? ? child: Text(
? ? ? ? ? ? active ? 'Active' : 'Inactive',
? ? ? ? ? ? style: const TextStyle(fontSize: 32.0, color: Colors.white),
? ? ? ? ? ),
? ? ? ? ),
? ? ? ? width: 200.0,
? ? ? ? height: 200.0,
? ? ? ? decoration: BoxDecoration(
? ? ? ? ? color: active ? Colors.lightGreen[700] : Colors.grey[600],
? ? ? ? ),
? ? ? ),
? ? );
? }
}

//------------------------- MyApp ----------------------------------

class MyApp extends StatelessWidget {
? const MyApp({Key? key}) : super(key: key);

? @override
? Widget build(BuildContext context) {
? ? return MaterialApp(
? ? ? title: 'Flutter Demo',
? ? ? home: Scaffold(
? ? ? ? appBar: AppBar(
? ? ? ? ? title: const Text('Flutter Demo'),
? ? ? ? ),
? ? ? ? body: const Center(
// ? ? ? ? ?child: TapboxA(),
? ? ? ? ? child: ParentWidget(),

? ? ? ? ),
? ? ? ),
? ? );
? }
}

混搭管理

混搭管理狀態(tài),就是因為有些情況下我們需要父組件管理一部分狀態(tài),子組件獨立管理另一部分狀態(tài)。在本次,我們根據(jù)上例添加一個動效,按鈕按下時要顯示高亮狀態(tài)(前文講過,動效一類的狀態(tài)一般要組件本身管理),抬起時取消高亮。
如下代碼:ParentWidget負責維護_active狀態(tài)來標志是否被激活,子組件TapboxC負責維護_highlight狀態(tài)用來控制是否高亮顯示。

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());


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

? @override
? _ParentWidgetState createState() => _ParentWidgetState();
}

class _ParentWidgetState extends State<ParentWidget> {
? bool _active = false;

? void _handleTapboxChanged(bool newValue) {
? ? setState(() {
? ? ? _active = newValue;
? ? });
? }

? @override
? Widget build(BuildContext context) {
? ? return SizedBox(
? ? ? child: TapboxC(
? ? ? ? active: _active,
? ? ? ? onChanged: _handleTapboxChanged,
? ? ? ),
? ? );
? }
}

//----------------------------- TapboxC ------------------------------

class TapboxC extends StatefulWidget {
? const TapboxC({
? ? Key? key,
? ? this.active = false,
? ? required this.onChanged,
? }) : super(key: key);

? final bool active;
? final ValueChanged<bool> onChanged;

? @override
? _TapboxCState createState() => _TapboxCState();
}

class _TapboxCState extends State<TapboxC> {
? bool _highlight = false;

? void _handleTapDown(TapDownDetails details) {
? ? setState(() {
? ? ? _highlight = true;
? ? });
? }

? void _handleTapUp(TapUpDetails details) {
? ? setState(() {
? ? ? _highlight = false;
? ? });
? }

? void _handleTapCancel() {
? ? setState(() {
? ? ? _highlight = false;
? ? });
? }

? void _handleTap() {
? ? widget.onChanged(!widget.active);
? }

? @override
? Widget build(BuildContext context) {
? ? return GestureDetector(
? ? ? onTapDown: _handleTapDown, // Handle the tap events in the order that
? ? ? onTapUp: _handleTapUp, // they occur: down, up, tap, cancel
? ? ? onTap: _handleTap,
? ? ? onTapCancel: _handleTapCancel,
? ? ? child: Container(
? ? ? ? child: Center(
? ? ? ? ? child: Text(widget.active ? 'Active' : 'Inactive',
? ? ? ? ? ? ? style: const TextStyle(fontSize: 32.0, color: Colors.white)),
? ? ? ? ),
? ? ? ? width: 200.0,
? ? ? ? height: 200.0,
? ? ? ? decoration: BoxDecoration(
? ? ? ? ? color: _highlight?Colors.lightGreen :widget.active ? Colors.lightGreen[700] : Colors.grey[600],
? ? ? ? ),
? ? ? ),
? ? );
? }
}
//------------------------- MyApp ----------------------------------

class MyApp extends StatelessWidget {
? const MyApp({Key? key}) : super(key: key);

? @override
? Widget build(BuildContext context) {
? ? return MaterialApp(
? ? ? title: 'Flutter Demo',
? ? ? home: Scaffold(
? ? ? ? appBar: AppBar(
? ? ? ? ? title: const Text('Flutter Demo'),
? ? ? ? ),
? ? ? ? body: const Center(
// ? ? ? ? ?child: TapboxA(),
? ? ? ? ? child: ParentWidget(),

? ? ? ? ),
? ? ? ),
? ? );
? }
}

當然你也可以把高亮顯示的狀態(tài)交給父組件來管理,但是當你開發(fā)完這個組件交給同事來用的時候,別人可能只會關注業(yè)務邏輯上的處理,不會關注的動效處理。

其他交互組件

Flutter內(nèi)部預置了很多交互組件,甚至還有IOS風格的組件,都可以拿來用。如果有必要的話,可以向上面的例子一樣自定義組件使用。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android利用RenderScript實現(xiàn)毛玻璃模糊效果示例

    Android利用RenderScript實現(xiàn)毛玻璃模糊效果示例

    毛玻璃效果(亦稱磨砂效果),近兩年在移動端的UI設計上越來越流行,下面這篇文章主要介紹了Android利用RenderScript實現(xiàn)毛玻璃模糊效果的相關資料,文中給出了詳細的示例代碼,需要的朋友可以參考學習,下面來一起看看吧。
    2017-03-03
  • Android的Activity跳轉動畫各種效果整理

    Android的Activity跳轉動畫各種效果整理

    Android的Activity跳轉就是很生硬的切換界面。其實Android的Activity跳轉可以設置各種動畫,本文整理了一些,還有很多動畫效果,就要靠我們發(fā)揮自己的想象力
    2013-06-06
  • Android ViewModel的使用總結

    Android ViewModel的使用總結

    ViewModel 是 Jetpack 的一部分。 ViewModel 類旨在以注重生命周期的方式存儲和管理界面相關的數(shù)據(jù)。ViewModel 類讓數(shù)據(jù)可在發(fā)生屏幕旋轉等配置更改后繼續(xù)留存。本文簡單講解ViewModel的使用
    2021-06-06
  • Android自動測試工具Monkey

    Android自動測試工具Monkey

    Monkey是Android中的一個命令行工具,可以運行在模擬器里或實際設備中。它向系統(tǒng)發(fā)送偽隨機的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等),實現(xiàn)對正在開發(fā)的應用程序進行壓力測試。Monkey測試是一種為了測試軟件的穩(wěn)定性、健壯性的快速有效的方法
    2016-01-01
  • Android開發(fā)中DatePicker日期與時間控件實例代碼

    Android開發(fā)中DatePicker日期與時間控件實例代碼

    本文通過實例代碼給大家介紹了Android開發(fā)中DatePicker日期與時間控件,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-08-08
  • Android從0到完整項目(1)使用Android studio 創(chuàng)建項目詳解

    Android從0到完整項目(1)使用Android studio 創(chuàng)建項目詳解

    本篇文章主要介紹了Android從0到完整項目(1)使用Android studio 創(chuàng)建項目詳解,具有一定的參考價值,有興趣的可以了解一下
    2017-07-07
  • Android自定義ScrollView使用自定義監(jiān)聽

    Android自定義ScrollView使用自定義監(jiān)聽

    這篇文章主要介紹了Android自定義ScrollView使用自定義監(jiān)聽 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android開發(fā)之高德地圖實現(xiàn)定位

    Android開發(fā)之高德地圖實現(xiàn)定位

    本篇文章主要介紹了Android中高德地圖實現(xiàn)定位的相關知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • Android Volley圖片加載功能詳解

    Android Volley圖片加載功能詳解

    這篇文章主要為大家詳細介紹了Android Volley圖片加載功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android中自定義控件之液位指示器

    Android中自定義控件之液位指示器

    這篇文章主要介紹了Android中自定義控件之液位指示器 方法的相關資料,需要的朋友可以參考下
    2016-03-03

最新評論

扎囊县| 洪湖市| 西峡县| 文登市| 灵丘县| 招远市| 邢台县| 沈丘县| 琼海市| 洛宁县| 漾濞| 延边| 高台县| 丹棱县| 漳浦县| 盐亭县| 南平市| 什邡市| 太谷县| 万源市| 彰化市| 扶沟县| 云阳县| 虹口区| 澄江县| 龙游县| 五指山市| 辛集市| 射洪县| 兴文县| 牟定县| 碌曲县| 延吉市| 常熟市| 濉溪县| 渭南市| 大理市| 南江县| 衡阳市| 安岳县| 修武县|