91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Android中Flutter的mixin有什么用

發布時間:2022-02-25 14:34:53 來源:億速云 閱讀:141 作者:小新 欄目:開發技術

小編給大家分享一下在Android中Flutter的mixin有什么用,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

mixin是什么

mixin應該怎么理解呢,對Java系出身的我來說,這是一個新概念,各類資料的介紹也沒找到一個清晰的定義。從個人理解來看,可以把它想象為Kotlin中的接口(和Java的區別是可以帶非抽象的屬性和方法),而多個mixin可以相互覆蓋以實現組合,提供了非常大的靈活性,也可以達到類似多重繼承的效果。

頁表頁面

這是一個普通的展示數據,上拉加載更多數據的列表。

其中有一個類型為List<T>的數據列表listData,有個page數據用于分頁,isLoading用來判斷是否正在加載數據,scrollController用于列表控制器

如果存在大量這種頁面則可以用mixin來處理,不免大量重復的代碼

import 'package:flutter/material.dart';
import 'package:flutter_app/app/model/ListViewJson.dart';
import 'package:flutter_app/app/shared/api/api.dart';
import 'package:dio/dio.dart';
import 'dart:convert';

import 'package:flutter_app/app/shared/mixins/list_more_data_mixin.dart';

/// 列表頁面
class RecommendView extends StatefulWidget {
 @override
 _RecommendViewState createState() => _RecommendViewState();
}

class _RecommendViewState
 extends ListMoreDataBase<ListViewJsonData, RecommendView>
 with ListMoreDataMixin<ListViewJsonData, RecommendView> {
 @override
 Future<List<ListViewJsonData>> getData() async {
 String data = await DioUtils.postHttp(
 "api/getOneLevel",
 parameters: FormData.fromMap({
 'page': page,
 'limit': '10',
 }),
 );
 ListViewJson _json = ListViewJson.fromJson(json.decode(data));
 return _json.data;
 }

 @override
 void initState() {
 print('init widget');
 super.initState();
 }

 @override
 void dispose() {
 print('dispose widget');
 super.dispose();
 }

 @override
 Widget build(BuildContext context) {
 return Scaffold(
 backgroundColor: Colors.white,
 appBar: AppBar(title: Text('返回')),
 body: Stack(
 children: <Widget>[
  NotificationListener<ScrollNotification>(
  onNotification: onNotification,
  child: ListView.builder(
  controller: scrollController,
  itemCount: listData.length,
  itemBuilder: (BuildContext context, int index) =>
   TeamListItem(listData[index]),
  ),
  ),
  isLoading ? Center(child: CircularProgressIndicator()) : Container()
 ],
 ),
 );
 }
}

mixin

import 'package:flutter/material.dart';

abstract class ListMoreDataBase<T, K extends StatefulWidget> extends State<K> {
 /// 獲取異步數據
 Future<List<T>> getData();
}

/// 在
mixin ListMoreDataMixin<T, K extends StatefulWidget> on ListMoreDataBase<T, K> {
 @override
 void initState() {
 print('init');
 super.initState();
 initData();
 }

 @override
 void dispose() {
 print('dispose');
 super.dispose();
 scrollController?.dispose();
 }

 /// 數據列表
 List<T> listData = [];

 /// 分頁
 int page = 1;

 /// 是否在加載數據
 bool isLoading = false;

 /// 滾動條控制器
 ScrollController scrollController = ScrollController();

 /// 初始化數據
 Future<void> initData() async {
 setState(() {
 isLoading = true;
 });

 List<T> data = await getData();
 if (!mounted) return;
 setState(() {
 listData = data;
 isLoading = false;
 });
 }

 /// 上拉加載更多
 Future<void> loadMore() async {
 setState(() {
 isLoading = true;
 page += 1;
 });

 List<T> data = await getData();

 if (data.isEmpty) {
 page--;
 }

 setState(() {
 listData.addAll(data);
 isLoading = false;
 });
 }

 bool canLoadMore(ScrollNotification scroll) {
 return !isLoading &&
 scroll.metrics.maxScrollExtent <= scrollController.offset;
 }

 bool onNotification(ScrollNotification scroll) {
 if (canLoadMore(scroll)) {
 loadMore();
 }
 return true;
 }
}

注:

  • dart是單繼承

  • 在類中,能重寫mixin的屬性和方法,并且也能用super調用miixn屬性和方法

  • 上面的生命周期依次打印 init widget -> init -> dispose widget -> dispose

ps:下面從簡單到復雜,演示mixin在Dart中的用法

最簡單的mixin

mixin TestMixin {
 void test() {
 print('test');
 }
 int testInt = 1;
 void test2();
}
 
class Test with TestMixin {
 @override
 test2() {
 print('test2');
 }
}

void main() {
 Test().test();  // test
 print(Test().testInt); // 1
 Test().test2();  // test2
}

mixin本身可以是抽象的,可以定義各種方法屬性,也可以是抽象的,等后續類去實現

基于某個類型的mixin

class BaseObject {
 void method() {
 print('call method');
 }
}
mixin TestMixin on BaseObject{
 void test() {
 print('test');
 }
 int testInt = 1;
 void test2() {
 method();
 }
}
 
class Test extends BaseObject with TestMixin {
}
 
void main() {
 Test().test();  // test
 print(Test().testInt); // 1
 Test().test2();  // call method
}

當使用on關鍵字,則表示該mixin只能在那個類的子類使用了,那么結果顯然的,mixin中可以調用那個類定義的方法、屬性

多個mixin

mixin TestMixin {
 void test() {
 print('test');
 }
 
 int testInt = 1;
 
 void test2();
}
 
mixin TestMixin2 {
 int testInt = 2;
 
 void test3() {
 print('test3');
 }
}
 
class Test with TestMixin, TestMixin2 {
 @override
 test2() {
 print('test2');
 }
}
 
void main() {
 Test().test();  // test
 print(Test().testInt); // 2
 Test().test2();  // test2
 Test().test3();  // test3
}

如果把TestMixin和TestMixin2的先后順序改一下:

mixin TestMixin {
 void test() {
 print('test');
 }
 
 int testInt = 1;
 
 void test2();
}
 
mixin TestMixin2 {
 int testInt = 2;
 
 void test3() {
 print('test3');
 }
}
 
class Test with TestMixin2, TestMixin {
 @override
 test2() {
 print('test2');
 }
}
 
void main() {
 Test().test();  // test
 print(Test().testInt); // 1
 Test().test2();  // test2
 Test().test3();  // test3
}

如果mixin存在沖突的部分,后面會覆蓋前面的,沒有沖突的則會保留,所以可以存在后面的mixin修改了前面的mixin的一部分邏輯的情況,不需要直接繼承即可實現覆蓋,避免了更復雜的繼承關系

"多重繼承"
mixin TestMixin on BaseClass {
 void init() {
 print('TestMixin init start');
 super.init();
 print('TestMixin init end');
 }
}
 
mixin TestMixin2 on BaseClass {
 void init() {
 print('TestMixin2 init start');
 super.init();
 print('TestMixin2 init end');
 }
}
 
class BaseClass {
 void init() {
 print('Base init');
 }
 BaseClass() {
 init();
 }
}
 
class TestClass extends BaseClass with TestMixin, TestMixin2 {
 
 @override
 void init() {
 print('TestClass init start');
 super.init();
 print('TestClass init end');
 
 }
}
 
void main() {
 TestClass();
 /// TestClass init start
 /// TestMixin2 init start
 /// TestMixin init start
 /// Base init
 /// TestMixin init end
 /// TestMixin2 init end
 /// TestClass init end
}

稍微有點繞,可以看到,這已經事實上達到多重繼承才能達到的效果了,寫起來比較麻煩,某種程度上也更不容易出錯(相對于C++)。。。源碼里有最好也最復雜的例子—WidgetsFlutterBinding,它的定義如下:

class WidgetsFlutterBinding 
extends BindingBase with GestureBinding, 
ServicesBinding, 
SchedulerBinding, 
PaintingBinding, 
SemanticsBinding,
 RendererBinding,
 WidgetsBinding 
{
}

看完了這篇文章,相信你對“在Android中Flutter的mixin有什么用”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

麻栗坡县| 凭祥市| 洛南县| 汉寿县| 大关县| 西贡区| 玛纳斯县| 江川县| 工布江达县| 洛川县| 叙永县| 建湖县| 栾城县| 三台县| 石景山区| 三门峡市| 盘山县| 灵川县| 宝鸡市| 栾城县| 隆化县| 宁乡县| 新田县| 澎湖县| 浮山县| 梨树县| 兴城市| 呼玛县| 吕梁市| 伊宁市| 吐鲁番市| 宣威市| 留坝县| 湘潭市| 广昌县| 磐安县| 彩票| 五家渠市| 海口市| 青浦区| 镇康县|