真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

fluttergetx的簡單介紹

Flutter GetX基礎(chǔ)教程(十二):RxList、Rx([])、.obs對比分析

首先我們知道 GetX 組件里面 obs 狀態(tài)管理有三種創(chuàng)建屬性的方式,我們這里以 List 為例

創(chuàng)新互聯(lián)公司長期為上千余家客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為膠州企業(yè)提供專業(yè)的網(wǎng)站建設、成都網(wǎng)站建設,膠州網(wǎng)站改版等技術(shù)服務。擁有十多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

視頻講解鏈接

我們聲明了一個類ListController 繼承自 GetxController ,用于屬性創(chuàng)建以及狀態(tài)通知的方法,首先我們用三種方式來創(chuàng)建屬性并且通過 convertToUpperCase 方法進行對值的改變,然后我們通過調(diào)用 update()`方法來進行數(shù)據(jù)更新,最后我們使用該屬性狀態(tài)的值,接下來我們看一下三種使用方式的對比。

import 'dart:convert';

import 'package:get/get.dart';

class ListController extends GetxController {

// 第一種

final listOne = RxListMap([

{

"name": "Jimi",

"age": 18

}

]);

// 第二種

final listTwo = RxList([

{

"name": "Jimi",

"age": 18

}

]);

// 第三種

final listThree = [{

"name": "Jimi",

"age": 18

}].obs;

void convertToUpperCase() {

listOne.value[0]["name"] = listOne.value.first["name"].toUpperCase();

listTwo.toList().first["name"] = listTwo.toList().first["name"].toString().toUpperCase();

listThree.toList().first["name"] = listTwo.toList().first["name"].toString().toUpperCase();

update();

}

}

我們在頁面中獲取狀態(tài)更新的值

import 'package:flutter/material.dart';

import 'package:flutter_getx_dvanced_example/ListController.dart';

import 'package:get/get.dart';

void main() {

runApp(MyApp());

}

class MyApp extends StatelessWidget {

ListController listController = Get.put(ListController());

@override

Widget build(BuildContext context) {

return GetMaterialApp(

title: "GetX",

home: Scaffold(

appBar: AppBar(

title: Text("GetX"),

),

body: Center(

child: Column(

mainAxisAlignment: MainAxisAlignment.center,

crossAxisAlignment: CrossAxisAlignment.center,

children: [

GetBuilderListController(

init: listController,

builder: (controller) {

return Text(

"我的名字是 {controller.listTwo.first['name']}",

style: TextStyle(color: Colors.green, fontSize: 30),

);

},

),

SizedBox(height: 20,),

GetBuilderListController(

init: listController,

builder: (controller) {

return Text(

"我的名字是 ${controller.listThree.first['name']}",

style: TextStyle(color: Colors.green, fontSize: 30),

);

},

),

SizedBox(height: 20,),

ElevatedButton(

onPressed: () {

listController.convertToUpperCase();

},

child: Text("轉(zhuǎn)換為大寫"))

],

),

),

),

);

}

}

/pre

|`

效果展示

RxT 繼承自 _RxImplT , _RxImplT 又繼承 RxNotifierT 并混合 RxObjectMixinT 類

RxImplT 它主要的作用是管理泛型的所有邏輯的。

RxObjectMixinT 它主要的作用是管理注冊到 GetX 和 Obx 的全局對象,比如 Widget 的 Rx 值

RxT 它主要的作用是將自定義模型類用Rx`來進行包裝,

class RxT extends _RxImplT {

Rx(T initial) : super(initial);

@override

dynamic toJson() {

try {

return (value as dynamic)?.toJson();

} on Exception catch (_) {

throw '$T has not method [toJson]';

}

}

}

abstract class _RxImplT extends RxNotifierT with RxObjectMixinT {

_RxImpl(T initial) {

_value = initial;

}

void addError(Object error, [StackTrace? stackTrace]) {

subject.addError(error, stackTrace);

}

StreamR mapR(R mapper(T? data)) = stream.map(mapper);

void update(void fn(T? val)) {

fn(_value);

subject.add(_value);

}

void trigger(T v) {

var firstRebuild = this.firstRebuild;

value = v;

if (!firstRebuild) {

subject.add(v);

}

}

}

/pre

|`

RxListE 繼承自 ListMixinE 實現(xiàn)了 RxInterfaceListE 并混合了 NotifyManagerListE, RxObjectMixinListE

RxListE 它的主要作用是創(chuàng)建一個類似于 ListT 的一個列表

class RxListE extends ListMixinE

with NotifyManagerListE, RxObjectMixinListE

implements RxInterfaceListE {

RxList([ListE initial = const []]) {

_value = List.from(initial);

}

factory RxList.filled(int length, E fill, {bool growable = false}) {

return RxList(List.filled(length, fill, growable: growable));

}

factory RxList.empty({bool growable = false}) {

return RxList(List.empty(growable: growable));

}

/// Creates a list containing all [elements].

factory RxList.from(Iterable elements, {bool growable = true}) {

return RxList(List.from(elements, growable: growable));

}

/// Creates a list from [elements].

factory RxList.of(IterableE elements, {bool growable = true}) {

return RxList(List.of(elements, growable: growable));

}

/// Generates a list of values.

factory RxList.generate(int length, E generator(int index),

{bool growable = true}) {

return RxList(List.generate(length, generator, growable: growable));

}

/// Creates an unmodifiable list containing all [elements].

factory RxList.unmodifiable(Iterable elements) {

return RxList(List.unmodifiable(elements));

}

@override

IteratorE get iterator = value.iterator;

@override

void operator []=(int index, E val) {

_value[index] = val;

refresh();

}

/// Special override to push() element(s) in a reactive way

/// inside the List,

@override

RxListE operator +(IterableE val) {

addAll(val);

refresh();

return this;

}

@override

E operator [](int index) {

return value[index];

}

@override

void add(E item) {

_value.add(item);

refresh();

}

@override

void addAll(IterableE item) {

_value.addAll(item);

refresh();

}

@override

int get length = value.length;

@override

@protected

ListE get value {

RxInterface.proxy?.addListener(subject);

return _value;

}

@override

set length(int newLength) {

_value.length = newLength;

refresh();

}

@override

void insertAll(int index, IterableE iterable) {

_value.insertAll(index, iterable);

refresh();

}

@override

IterableE get reversed = value.reversed;

@override

IterableE where(bool Function(E) test) {

return value.where(test);

}

@override

IterableT whereTypeT() {

return value.whereTypeT();

}

@override

void sort([int compare(E a, E b)?]) {

_value.sort(compare);

refresh();

}

}

/pre

|`

當我們在調(diào)用 .obs 的時候其實內(nèi)部的實現(xiàn)源碼還是通過 RxListe(this) 進行了一層包裝,設計這個主要的目的就是為了方便開發(fā)者進行使用

ListExtensionE on ListE {

RxListE get obs = RxListE(this);

/// Add [item] to [ListE] only if [item] is not null.

void addNonNull(E item) {

if (item != null) add(item);

}

// /// Add [IterableE] to [ListE] only if [IterableE] is not null.

// void addAllNonNull(IterableE item) {

// if (item != null) addAll(item);

// }

/// Add [item] to ListE only if [condition] is true.

void addIf(dynamic condition, E item) {

if (condition is Condition) condition = condition();

if (condition is bool condition) add(item);

}

/// Adds [IterableE] to [ListE] only if [condition] is true.

void addAllIf(dynamic condition, IterableE items) {

if (condition is Condition) condition = condition();

if (condition is bool condition) addAll(items);

}

/// Replaces all existing items of this list with [item]

void assign(E item) {

// if (this is RxList) {

// (this as RxList)._value;

// }

}

/// Replaces all existing items of this list with [items]

void assignAll(IterableE items) {

// if (this is RxList) {

// (this as RxList)._value;

// }

clear();

addAll(items);

}

}

/pre

|`

我們對 RxT([]) 、 RxListE 、 .obs 進行了一個總結(jié),在我們平時的開發(fā)過程中建議大家使用 .obs 即可,因為這是最簡單的方式。

flutter 使用Getx提示錯誤

新手最近在使用Getx做狀態(tài)管理, 在使用中遇到問題, 隨手記錄下,

提示錯誤:

GET the improper use of a getx has been detected you should only use getx or obx for the specific widget that will be updated. if you are seeing this error, you probabaly did not insert any observable variables into GetX/Obx...

其實提示很明顯, 就是Obx()中組件沒用到controller內(nèi)容, 比如Obx(()=Text("123")), 這里面Obx沒有用到GetxController的對象, 就會報這個錯誤,如果改成Obx(()=Text(controller.content)), 就可以了

Flutter狀態(tài)管理--GetX的簡單使用

一、前言

Flutter開發(fā),就需要對各種狀態(tài)的管理,就是在請求數(shù)據(jù)的時候需要實時變化,各種交互變化等,在沒有使用GetX之前使用Provider,用Provider的時候覺得真香,挺方便的,需要刷新的時候直接 notifyListeners(); 用了GetX之后覺得Provider太繁瑣了。這邊介紹下GetX的使用以及常用的方法。

二、 GetX

GetX 是 Flutter 上的一個輕量且強大的解決方案:高性能的狀態(tài)管理、智能的依賴注入和便捷的路由管理。

1、相關(guān)優(yōu)勢:

三、使用

1、第一步 引入get

2、第二步

修改入口、配置路由

3、路由

Routes類

Pages類

4、狀態(tài)管理

我一般一個page對應一個controller, controller來處理邏輯,控制page.

簡單使用

5、依賴注入

依賴注入也是我喜歡的,可以減少很多工作。

第一步

第二步

6、跨頁面交互

7、黑暗模式

可以參考前期寫的博客。 黑暗模式的適配

Flutter框架 - GetX

GetX 是 Flutter 上的一個輕量且強大的解決方案:高性能的狀態(tài)管理、智能的依賴注入和便捷的路由管理。

GetX的優(yōu)勢

對比provider,GetX可能更受歡迎

下面是GetX在pub上面的likes數(shù)據(jù)

下面是GetX在github上面的star數(shù)據(jù)

GetX 因為不需要上下文,突破了InheritedWidget的限制,我們可以在全局和模塊間共享狀態(tài),這正是 BLoc 、Provider 等框架的短板

1、?在MaterialApp前添加 "Get",將其變成GetMaterialApp。

2、創(chuàng)建業(yè)務邏輯類,并將所有的變量,方法和控制器放在里面。 你可以使用一個簡單的".obs "使任何變量成為可觀察的。

3、引用邏輯類,在界面顯示

幾個注意點

1、

效果一樣

2、

效果一樣

3、

效果一樣

1、Obx

2、GetX

3、GetBuilder

4、ValueBuilder

;target=VSCodecategory=Programming%20LanguagessortBy=Relevance


文章題目:fluttergetx的簡單介紹
當前URL:http://weahome.cn/article/hocsee.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部