Flutter第7天--字体图标+综合小案例+Android代码交互,经验分享

@override
Widget build(BuildContext context) {

var scaffold = Scaffold(
appBar: AppBar(
title: Text(“张风捷特烈”),
),
body: Container(),
floatingActionButton: FloatingActionButton(
onPressed: () {

},
tooltip: ‘Increment’,
child: Icon(Icons.add),
),
);

return scaffold;
}
}


2.拼接底部条

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


2.1:常量的准备:(为了方便使用或修改)

class ItemBean {
Color color;
IconData iconId;
String info;
ItemBean(this.color, this.iconId, this.info);
}

//底部栏图标信息
var iconLi=[
ItemBean(Color(0xff8FC552),TolyIcon.android,“Android”),
ItemBean(Color(0xff6BFB00),TolyIcon.icon_spring_boot,“SpringBoot”),
ItemBean(Color(0xff63DAFF),TolyIcon.react,“React”),
ItemBean(Color(0xffF3D861),TolyIcon.biji,“编程随笔”),
ItemBean(Color(0xff5CEBF2),TolyIcon.daima,“系列文章”)
];


2.2:底部栏:

//成员变量
int _curIndex = 0;

//底部栏
var bottomNavigationBar = BottomNavigationBar(
items: iconLi.map((item) {
return BottomNavigationBarItem(
title: Text(
item.info,
style: TextStyle(fontSize: 12, color: Colors.black),
),
icon: Icon(
item.iconId,
color: item.color,
),
backgroundColor: Color(0xffffffff));
}).toList(),
currentIndex: _curIndex,
onTap: _onTapBNB,
);


2.3:底部栏点击监听:_onTapBNB

//底部栏点击监听
void _onTapBNB(int position) {
_curIndex = position;
setState(() {});
}


3:页面条目:

第五天写了几个条目,现在拿来用(详细分析见第五天,这里不废话了)

静态填充左侧滑栏
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
3.1:左侧滑栏:left_draw.dart

class LeftDrawPage extends StatefulWidget {
@override
_LeftDrawPageState createState() => _LeftDrawPageState();
}

class _LeftDrawPageState extends State
with SingleTickerProviderStateMixin {
@override
Widget build(BuildContext context) {
//左边头像
var headImg3 = Image.asset(
“images/icon_90.png”,
width: 50,
height: 50,
);
//中间的信息
var center3 = Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
“张风捷特烈”,
style: bigStyle,
),
Row(
children: [
Icon(Icons.next_week, size: 15),
pd(Text(“创世神 | 无”), l: 5)
],
),
Row(
children: [
Icon(Icons.keyboard, size: 15),
pd(Text(“海的彼岸有我未曾见证的风采”), l: 5)
],
),
],
);
var rowLine3 = Row(
children: [
pda(headImg3, 5),
Expanded(child: pda(center3, 5)),
],
);
var test3 = Card(
child: Container(
height: 95,
color: Colors.white,
padding: EdgeInsets.all(5),
child: rowLine3));
return Drawer(
elevation: 5,
child: Container(
padding: EdgeInsets.only(top: 50),
alignment: AlignmentDirectional.topCenter,
color: Color(0xff99C6F9),
child: test3));
}
}


3.2:列表静态填充:home_list.dart

class HomeListPage extends StatefulWidget {
@override
_HomeListPageState createState() => _HomeListPageState();
}

class _HomeListPageState extends State {
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: 10,
itemBuilder: (BuildContext context, int index) {
return renderItem(index);
},
);
}

renderItem(int index) {
-----------------测试4--------------------------------
var line1_4 = Row(
children: [
Image.asset(“images/icon_90.png”, width: 20, height: 20),
Expanded(
child: pd(Text(“张风捷特烈”), l: 5),
),
Text(
“Flutter/Dart”,
style: infoStyle,
)
],
);

var center_right = Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
“Flutter第4天–基础控件(下)+Flex布局详解”,
style: littelStyle,
maxLines: 2,
),
pd(
Text(
“1.2:优雅地查看:图片的适应模式–BoxFit1.3:优雅地查看:颜色混合模式–colorBlendMode”,
style: infoStyle,
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
t: 5),
],
);

//中间的信息
var center4 = Row(
children: [
Expanded(child: pda(center_right, 5)),
Image.asset(
“images/wy_300x200.jpg”,
width: 80,
height: 80,
fit: BoxFit.fitHeight,
)
],
);

var end4 = Row(
children: [
Icon(
Icons.grade,
color: Colors.green,
size: 20,
),
Text(
“1000W”,
style: infoStyle,
),
pd(Icon(Icons.tag_faces, color: Colors.lightBlueAccent, size: 20),
l: 15, r: 5),
Text(“2000W”, style: infoStyle),
],
);

var item4 = Column(
children: [line1_4, Expanded(child: center4), end4],
);

var aCard = Card(
child: Container(
height: 160,
color: Colors.white,
padding: EdgeInsets.all(10),
child: item4));

return aCard;
}
}


4.动态数据获取:

昨天已经把http获取数据的内容将过了,并且把服务端的数据解析了

今天就是使用这些数据,来填充静态界面,api接口介绍NoteBean昨天已完成

封装一个获取数据的方法:简单说下用法:

style是类型:Android是A ;SpringBoot是SB ; React 是Re ; 笔记是 Note
offset和num 联合使用可以达到分页效果, 比如offset=24,num=12,就是一页12条数据的第3页

import ‘dart:convert’;

import ‘package:http/http.dart’ as client;
import ‘package:toly/pager/day7/bean.dart’;

const BASE_URL = ‘http://192.168.43.60:8089’;//api接口的域名自己改一下
const API = ‘/api/android/note/’;

Future<List> get({style = ‘’, offset = 0, num = 1}) async {
var dataLi = [];
var url = BASE_URL + API + style + “/” + “ o f f s e t " + " / " + " offset" + "/" + " offset"+"/"+"num”;
try {
final response = await client.get(url);
if (response.statusCode == 200) {
var result = ResultBean.fromJson(json.decode(response.body));
List data = result.data;
print(NoteBean.fromJson(data[0]).type);
for (int i = 0; i < data.length; i++) {
dataLi.add(NoteBean.fromJson(data[i]));
}
return dataLi;
}
} catch (e) {
print(e);
}
}


5.用一个数据来进行填充测试:

主页面:android_stack.dart,initState的时候获取数据,并更新状态

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

//定义一个成员变量
List _notes = [];

@override
void initState() {
super.initState();

get(num: 1).then((beanLi) {
_notes = beanLi;
setState(() {});
});
}

列表界面:home_list.dart:接收主界面传来的_notes,并渲染数据

class HomeListPage extends StatefulWidget {
List _notes;
HomeListPage(List notes) {
_notes = notes;
}
@override
_HomeListPageState createState() => _HomeListPageState();
}

class _HomeListPageState extends State {
@override
Widget build(BuildContext context) {
var notes = widget._notes;

return ListView.builder(
itemCount: notes.length,
itemBuilder: (BuildContext context, int index) {
return renderItem(notes[index]);
},
);
}
//渲染条目
renderItem(NoteBean note) {
var line1_4 = Row(
children: [
Image.asset(“images/icon_90.png”, width: 20, height: 20),
Expanded( child: pd(Text(“张风捷特烈”), l: 5),),
Text( note.type,style: infoStyle,)
],
);
var center_right = Column(
mainAxisSize: MainAxisSize.min,
children: [Text(note.name,style: littelStyle,maxLines: 2,),
pd(Text( note.info, style: infoStyle, maxLines: 2,
overflow: TextOverflow.ellipsis, ), t: 5),
],
);

//中间的信息
var center4 = Row(
children: [
Expanded(child: pda(center_right, 5)),
Image.network( note.imgUrl,
width: 80, height: 80, fit: BoxFit.fitHeight )
],
);

var end4 = Row(
children: [
Icon( Icons.grade, color: Colors.green, size: 20, ),
Text( “1000W”, style: infoStyle,),
pd(Icon(Icons.tag_faces, color: Colors.lightBlueAccent, size: 20),
l: 15, r: 5),
Text(“2000W”, style: infoStyle),
],
);

var item4 = Column(
children: [line1_4, Expanded(child: center4), end4],
);

var aCard = Card(
child: Container( height: 160,color: Colors.white,
padding: EdgeInsets.all(10), child: item4));
return aCard;
}
}


现在万事俱备,东风也到了,num小小动一下:num=30

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

也许你感觉还未开始,但确实已经结束了…


6.底部导航栏的切换:(下面两个图一样的,为了撑场面…)

刚才是数据没有分类型,现在点击底部导航,按范围进行展示

get(style: "area/A", num: 30)//这样就是展示又有安卓类的文章

--
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

android_stack.dart添加成员变量

这里我默认加载完,做分页的话,再添加个_count的成员变量就行了

String style = “area/A”;

//页面打开,默认加载安卓页
@override
void initState() {
super.initState();
get(style: style, num: 1000).then((beanLi) {
_notes = beanLi;
setState(() {});
});
}

//底部栏点击监听—动态改变范围
void _onTapBNB(int position) {
switch (position) {
case 0:
style = “area/A”;
break;
case 1:
style = “area/SB”;
break;
case 2:
style = “area/Re”;
break;
case 3:
style = “area/Note”;
break;
case 4:
style = “area/A”;
break;
}
_curIndex = position;
get(style: style, num: 1000).then((beanLi) {
_notes = beanLi;
setState(() {});
});
}


7.底部栏和搜索功能

底部栏用法详情在第四篇

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

底部栏:这里把事件写在里面了,你也可以抽成方法

或者有些控件太长,你也可以抽出来做变量

var searchSheet = BottomSheet(
onClosing: () {},
builder: (context) => (Card(
color: Color.fromARGB(255, 214, 242, 251),
child: Wrap(
children: [
Center(child: pdhv(TextField(
onChanged: (v) {style = “name/” + v;}), h: 60)),
Center(child: pdhv( GestureDetector(child:
Image.asset(“images/icon_90.png”,width: 50,height: 50 ),
onTap: () {
get(style: style, num: 1000).then((beanLi) {
_notes = beanLi;
setState(() {});
});
},
),
v: 10)),
],
))));

//点击按钮弹出:
var scContext; //先声明一下Scaffold的context
var scaffold = Scaffold(
appBar: AppBar(
title: Text(“张风捷特烈”),
),
body: Builder(builder: (context) {
scContext = context;
return HomeListPage(_notes);
}),
floatingActionButton: FloatingActionButton(
onPressed: () {
Scaffold.of(scContext).showBottomSheet(searchSheet.builder);
},
//下面不用修改,略…

Ok,小案例就这样


三、Android代码交互
1.最简单的无参无返回函数调用:两对应

不得不说:前六天不能弹吐司真是不好受,原生交互肯定先拿他开刀

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


1.1:Android代码

public class MainActivity extends FlutterActivity {
private static final String CHANNEL = “www.toly1994.com/test.名字随意起”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);

new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
new MethodChannel.MethodCallHandler() {
@Override
public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
if (methodCall.method.equals(“showToast”)) {
showToast(“Hello Flutter,I am in Android”);
} else {
result.notImplemented();
}
}
}
);
}
/**

  • 显示吐司
  • @param msg 信息
    */
    public void showToast(String msg) {
    Toast toast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
    toast.show();
    }
    }

import ‘package:flutter/material.dart’;
import ‘package:flutter/services.dart’;

const platform = const MethodChannel(“www.toly1994.com/test.名字随意起”);

var toastTest = Center(
child: RaisedButton(
onPressed: () {
platform.invokeMethod(“showToast”);
},
child: new Text(“点击弹吐司”),
),
);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


2.Flutter中传参,调用Android含参方法:三对应

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


2.1:Android代码

public class MainActivity extends FlutterActivity {
private static final String CHANNEL = “www.toly1994.com/test.名字随意起”;

@Override
protected void onCreate(Bundle savedInstanceState) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

起";

@Override
protected void onCreate(Bundle savedInstanceState) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-Q3CLd9pM-1710925275109)]
[外链图片转存中…(img-FpugheLb-1710925275110)]
[外链图片转存中…(img-r1jwJzhE-1710925275110)]
[外链图片转存中…(img-xCq8pRLF-1710925275110)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-rMT8vFDW-1710925275111)]

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值