2025最新版Flutter3.38+Dart3.10+Get纯手撸抖音APP直播+短视频+聊天程序
经过半个月爆肝研发,最新款flutter3.38+dart3.10仿制抖音app短视频+聊天+直播商城系统。


技术栈
- 开发工具:vscode
- 跨平台框架:flutter3.38.2+dart3.10.0
- 状态管理:get: ^4.7.3
- 本地缓存服务:get_storage: ^2.1.1
- 瀑布流组件:flutter_staggered_grid_view^0.7.0
- 轮播图组件:card_swiper^3.0.1
- toast弹窗组件:shirne_dialog^4.8.6
- 视频套件:media_kit: ^1.2.3
- svg图片:flutter_svg: ^2.2.3
- 缓存图片:cached_network_image: ^3.4.1

实现一个类似抖音app首页联动切换效果。上下滚动切换短视频、左右滚动切换页面模块。

项目框架目录
flutter3-douyin使用最新跨平台技术Flutter3.38搭建项目框架模板。

目前该项目flutter3-douyin已经发布到我的原创作品集,欢迎下载使用。
https://b23.tv/BvqLkpx

项目入口配置
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:media_kit/media_kit.dart';
import 'package:shirne_dialog/shirne_dialog.dart';
import 'utils/common.dart';
// 引入布局页面
import 'layouts/index.dart';
// 引入路由配置
import 'router/index.dart';
void main() async {
// 初始化get_storage存储
await GetStorage.init();
// 初始化media_kit视频套件
WidgetsFlutterBinding.ensureInitialized();
MediaKit.ensureInitialized();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
// 是否windows平台
bool isWindows() {
if (kIsWeb) return false;
final platform = Theme.of(context).platform;
return platform == TargetPlatform.windows;
}
return GetMaterialApp(
title: 'Flutter3 DYMALL',
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFFFF2C55)),
useMaterial3: true,
// 修复windows下字体不一致情况 - Web 平台特殊处理
// fontFamily: Platform.isWindows ? 'Microsoft YaHei' : null
fontFamily: isWindows() ? 'Microsoft YaHei' : null
),
home: const Layout(),
// 初始化路由
initialRoute: Common.isLogin() ? '/' : '/login',
// 路由页面
getPages: routePages,
// 初始化弹窗key
navigatorKey: MyDialog.navigatorKey,
);
}
}






flutter3自定义抖音app首页联动功能
实现一个如下图:顶部状态栏+tab菜单+底部菜单三部分联动效果。

左右切换模块包含如下页面。

@override
Widget build(BuildContext context) {
return Scaffold(
key: scaffoldKey,
extendBodyBehindAppBar: true,
appBar: AppBar(
forceMaterialTransparency: true,
backgroundColor: [0, 1, 4, 5].contains(videoModuleController.videoTabIndex.value) ? null : Colors.transparent,
foregroundColor: [0, 1, 4, 5].contains(videoModuleController.videoTabIndex.value) ? Colors.black : Colors.white,
titleSpacing: 1.0,
leading: Obx(() => IconButton(
icon: Badge.count(
backgroundColor: Colors.red,
count: 6,
child: Icon(Icons.sort_rounded, color: tabColor(),),
),
onPressed: () {
// 自定义打开右侧drawer
scaffoldKey.currentState?.openDrawer();
},
)),
title: Obx(() {
return ScrollConfiguration(
behavior: CustomScrollBehavior().copyWith(scrollbars: false),
child: TabBar(
...
),
);
}),
actions: [
Obx(() => IconButton(icon: Icon(Icons.search_rounded, color: tabColor(),), onPressed: () {},),),
],
),
body: ScrollConfiguration(
behavior: CustomScrollBehavior().copyWith(scrollbars: false),
child: PageView(
controller: pageController,
onPageChanged: (index) {
videoModuleController.updateVideoTabIndex(index);
setState(() {
tabController.animateTo(index, duration: Duration(milliseconds: 200), curve: Curves.easeInOut);
});
},
children: [
...tabModules
],
),
),
// 侧边栏
drawer: Drawer(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.horizontal(right: Radius.circular(15.0))),
clipBehavior: Clip.antiAlias,
width: 300,
child: Container(
...
),
),
);
}
长列表页面切换Tab使得滚动状态保持不变,滚动页面开启缓存功能。
GlobalKey<ScaffoldState> scaffoldKey = GlobalKey(); VideoModuleController videoModuleController = Get.put(VideoModuleController()); late TabController tabController = TabController(initialIndex: videoModuleController.videoTabIndex.value, length: tabList.length, vsync: this); late PageController pageController = PageController(initialPage: videoModuleController.videoTabIndex.value, viewportFraction: 1.0); List<String> tabList = ['订阅', '逛逛', '直播', '团购', '短剧', '关注', '同城', '精选']; final tabModules = [ KeepAliveWrapper(child: SubscribeModule()), KeepAliveWrapper(child: BrowseModule()), KeepAliveWrapper(child: LiveModule()), KeepAliveWrapper(child: BuyingModule()), KeepAliveWrapper(child: DramaModule()), AttentionModule(), LocalModule(), RecommendModule() ];

class KeepAliveWrapper extends StatefulWidget {
final Widget child;
const KeepAliveWrapper({super.key, required this.child});
@override
State<KeepAliveWrapper> createState() => _KeepAliveWrapperState();
}
class _KeepAliveWrapperState extends State<KeepAliveWrapper> with AutomaticKeepAliveClientMixin {
@override
Widget build(BuildContext context) {
super.build(context);
return widget.child;
}
@override
bool get wantKeepAlive => true;
}






























整个项目包含了短视频+直播+聊天功能模块,涉及到的知识还是很多,希望以上分享对大家有点帮助。
最后附上几个最新实战项目案例
2025最新款Tauri2.9+Vite7+Vue3+ElementPlus电脑端后台管理系统Exe
最新版Vite7.1+Tauri2.8+Vue3电脑端仿QQ/微信聊天程序
Electron38.2实战客户端OS系统|vite7+vue3+electron仿mac/wins桌面
2025最新款Electron38+Vite7+Vue3+ElementPlus桌面客户端后台管理系统Exe
最新研发vite7.0+electron38客户端仿微信EXE聊天软件
原创uniapp+vite5+vue3+uv-ui跨三端短视频+直播+聊天app应用
uni-app+deepseek-v3跨三端ai流式输出对话模板
Flutter3.32实战桌面端OS系统|flutter3仿macOS桌面
flutter3.27跨平台仿微信客户端聊天Exe程序|朋友圈|短视频
flutter3+deepseek手机端ai流式输出聊天模板
实战跨平台Electron35+DeepSeek-V3搭建客户端AI模板
deepseek-v3+vue3.5网页版webai流式对话模板
- 点赞
- 收藏
- 关注作者
评论(0)