flutter弹框怎么封装_【无聊的编码】如何用Flutter制作底部弹框

本文介绍如何使用Flutter构建类似抖音的功能,包括状态管理、底部弹框、滚动列表及二级循环列表的实现。重点讲解了Provider进行状态管理的步骤,showModalBottomSheet创建底部弹框的方法,以及SingleChildScrollView和ListView.builder构建滚动列表的技巧。同时,还探讨了在处理二级循环列表时的数据结构和布局策略。
摘要由CSDN通过智能技术生成

大家好~这里依然是。。无聊的编码,上一期我们尝试使用一个小时的时间来复制抖音首页,这一期开始,我们将把重心放在功能的实现上。比如Flutter制作翻版抖音​www.bilibili.com如何利用Provider进行状态管理

如何设置底部带动画效果的弹框

如何设置可滚动的循环列表

如何在循环列表中增加二级循环列表

听起来有些混乱?先看一下效果图。还没做精修,就。。看效果吧。。如何设置Provider

作为Flutter官方推荐的状态管理工具,Provider可以算得上简单又好用了。只需几步基本的配置,就可以很大情况下摆脱StatefulWidget的束缚(哪些还得用StatefulWidget呢?),将状态管理这样的“复杂”工程,简单化。

首先定义即将使用的Provider

class MainProvider with ChangeNotifier {

XXXX

}

在即将使用到Provider的组件父级,通过MultiProvider进行声明,比如我即将要在ChildWidget中使用MainProvider,那么需要如何设置呢?

class ParentWidget extends StatelessWidget {

const ParentWidget({Key key}) : super(key: key);

@override

Widget build(BuildContext context) {

return Container(

child: MultiProvider(

providers: [ChangeNotifierProvider(builder: (context)=>MainProvider(),)],

child: ChildWidget()

),

);

}

}

class ChildWidget extends StatelessWidget {

const ChildWidget({Key key}) : super(key: key);

@override

Widget build(BuildContext context) {

MainProvider provider=Provider.of(context);

return Container(

child: Container(),

);

}

}

经过如此父级组件的注册声明,以及子组件的具体调用,就可以轻松的获取Provider中数据,方法,并对他进行修改啦,注意加上NotifyListeners()。如何设置底部弹框

Flutter已经很大程度上实现了各种高频率使用的功能,比如BottomSheet,也已经给出了非常好的实现。

想要弹框动画?想要非弹框区域灰色背景?想要点击非弹框区域让弹框消失?这些都不用自己实现啦~

只需要调用内置方法showModalBottomSheet(),就可以轻松解决。弹框内的Container可以高度定制,加圆角?加边框?加颜色?安排!

showModalBottomSheet(

shape: RoundedRectangleBorder(

borderRadius: BorderRadiusDirectional.circular(10)), //加圆角 context: context,

builder: (_) {

return MultiProvider(

providers: [ChangeNotifierProvider(builder: (context)=>MainProvider(),)],

child: Container(

height: 600, //定义高度 child: Container()),

)

;

});如何实现滚动列表

Flutter中,如果需要自定义滚动列表,则需要使用SingleChildScrollView,将可能会发生滚动的组件,嵌套在其之内就可以啦。

比如,我们可以将SingleChildScrollView套在Column组件的外层,就可以实现最基本的无限循环列表。如果不嵌套会怎么样?那么Column一定会报错,超出长度。

比如在抖音的回复列表里,我们就使用了两层嵌套。(更过源码请移步GitHub)

SingleChildScrollView(

controller: controller, //控制器 child: Container(

child: Column(

mainAxisSize: MainAxisSize.min,

children: [

Container(

height: 80 * rpx,

child: ListTile(

leading: Container(

width: 10 * rpx,

),

trailing: IconButton(

icon: Icon(Icons.close),

onPressed: () {},

),

title: Center(child: Text("10条评论")),

),

),

genReplyList(replies, controller)

],

),

));

但是在Flutter中,SingleChildScrollView与List View.builder均生成可无限滚动的列表,这样所导致的结果就是,对于整个区域以及其子区域,都是可进行独立滚动的。这就与我们的设计初衷有很大的差异。

别急,Flutter官方对于滚动效果,有其特殊的处理方式,也就是ScrollController组件。对于任意可滚动的组件,均可设置其controller,如果希望整屏同步滚动,将controller设置为同一对象即可,想玩分屏滚动?那就实例化不同的controller吧。如何设置二级循环

从实现的角度而言,与普通的循环并无太大的差异,只是我们需要更多的关注到数据的结构。比如当前所使用的回复列表

1篇视频-->多个回复-->同一回复多个子回复

面对如此的数据结构,我们自然也需要使用

1-->N-->N的实现方法。听起来乱了?视频课程也许更适合你哦~

Flutter中有多种方式来创建弹框。其中一种常见的方式是使用AlertDialog组件来构建一个简单的弹框。可以通过showDialog函数触发弹框的显示。在showDialog函数中,可以设置barrierDismissible来决定是否点击弹框外部区域可以关闭弹框,设置barrierColor来定义屏障的颜色,设置barrierLabel来给屏障定义一个字符串名称,还可以设置anchorPoint来偏移整个弹出框的位置。 另外,还可以使用showCupertinoDialog和CupertinoAlertDialog来创建弹框,或者使用SimpleDialog来创建一个简单的弹框。对于自定义的弹框,可以根据需要加入gif图片等效果。 例如,最简单的方案是利用AlertDialog组件构建一个弹框。示例代码如下: ```dart void alertDialog(BuildContext context) async { var result = await showDialog( barrierDismissible: false, context: context, builder: (context) { return AlertDialog( title: const Text("提示信息!"), content: const Text("您确定要删除吗"), actions: [ TextButton( onPressed: () { print("ok"); Navigator.of(context).pop("ok"); }, child: const Text("确定"), ), TextButton( onPressed: () { print("cancel"); Navigator.of(context).pop("取消"); }, child: const Text("取消"), ), ], ); }, ); print("-----------"); print(result); } ``` 除了AlertDialog,还可以使用SimpleDialog来创建弹框,具体用法可以参考相关文档。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【Flutter】【弹窗弹窗的快速上手使用和自定义Dialog](https://blog.csdn.net/weixin_43444734/article/details/127481395)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [【Flutter入门到进阶】Flutter基础篇---弹窗Dialog](https://blog.csdn.net/u010687761/article/details/129358724)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值