Flutter响应式布局插件responsive_page的使用
Flutter响应式布局插件responsive_page的使用
开始使用
responsive_widget
包含了一些可以创建响应式用户界面的小部件。这个包主要用于为不同设备(或尺寸)创建页面结构。
在这个包中,你需要重写四个不同的构建方法:
buildMobile
buildWideMobileOrTablet
buildWideTabletOrDesktop
buildDesktop
这个包应该只在需要根据大小变化时改变整个结构的情况下使用。
保存状态
对于我创建这个包的目的来说: 在大小变化时(特别是在Web上),状态不会丢失。
导入包
import 'package:responsive_page/responsive_page.dart';
创建页面
设置全局断点
void main() {
responsiveWidgetController.setDefaultBreakpoints(
mobile: 500,
wideMobileOrTablet: 800,
wideTabletOrDesktop: 1150
);
runApp(const MyApp());
}
状态fulWidget
在这个包中,结构变化时状态不会消失。
只需要用 ResponsiveState
替换 State
即可。
然后创建缺失的覆盖方法。
class ResponsiveWelcomePage extends StatefulWidget {
[@override](/user/override)
_ResponsiveWelcomePageState createState() => _ResponsiveWelcomePageState();
}
// 使用 ResponsiveState 替换 State
class _ResponsiveWelcomePageState extends ResponsiveState<ResponsiveWelcomePage> {
[@override](/user/override)
Widget buildDesktop(BuildContext context) {}
[@override](/user/override)
Widget buildMobile(BuildContext context) {}
[@override](/user/override)
Widget buildWideMobileOrTablet(BuildContext context) {}
[@override](/user/override)
Widget buildWideTabletOrDesktop(BuildContext context) {}
}
无状态小部件
扩展 ResponsiveWidget
并创建缺失的覆盖方法。
// 扩展 ResponsiveWidget
class ResponsiveStatelessExample extends ResponsiveWidget {
// 覆盖方法
}
减少种类
// 扩展 ResponsiveWidget
class ResponsiveStatelessExample extends ResponsiveWidget {
// 覆盖方法
[@override](/user/override)
Widget buildMobile(BuildContext context) {
return Container();
}
[@override](/user/override)
Widget buildWideMobileOrTablet(BuildContext context) => buildMobile();
}
完整示例
以下是一个完整的示例,展示了如何使用 responsive_page
插件来创建一个响应式页面。
主文件
import 'package:flutter/material.dart';
import 'package:responsive_page/responsive_page.dart';
void main() {
responsiveWidgetController.setDefaultBreakpoints(mobile: 500);
runApp(ResponsivePageExampleApp());
}
///
class ResponsivePageExampleApp extends StatelessWidget {
///
ResponsivePageExampleApp({Key key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: AtoBExample(),
);
}
}
///
class AtoBExample extends StatefulWidget {
[@override](/user/override)
_AtoBExampleState createState() => _AtoBExampleState();
}
class _AtoBExampleState extends State<AtoBExample> {
ScrollController scrollController = ScrollController();
_toB() {
scrollController.animateTo(MediaQuery.of(context).size.width,
curve: Curves.easeIn, duration: const Duration(milliseconds: 500));
}
_toA() {
scrollController.animateTo(0,
curve: Curves.easeIn, duration: const Duration(milliseconds: 500));
}
[@override](/user/override)
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;
return Scaffold(
body: SingleChildScrollView(
controller: scrollController,
scrollDirection: Axis.horizontal,
physics: const NeverScrollableScrollPhysics(),
child: Row(
children: [
// A
Builder(
builder: (c) {
print('GREEN BUILD');
return InkWell(
onTap: () {
print('TO B');
_toB();
},
child: Container(
width: size.width,
height: size.height,
color: Colors.green,
),
);
},
),
Builder(
builder: (c) {
print('RED BUILD');
return InkWell(
onTap: () {
print('TO A');
_toA();
},
child: Container(
width: size.width,
height: size.height,
color: Colors.red,
),
);
},
)
],
),
),
);
}
}
///
class MyHomePage extends StatefulWidget {
///
MyHomePage({Key key, this.title}) : super(key: key);
///
final String title;
[@override](/user/override)
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends ResponsiveState<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
Widget redBox(Size size) {
return Container(
height: size.height,
width: size.width,
color: Colors.red,
);
}
Widget greenBox(Size size) {
return Container(
height: size.height,
width: size.width,
color: Colors.green,
);
}
Widget action(int i) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'Action$i',
style: const TextStyle(fontSize: 18),
),
);
}
Widget countText() {
return Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
);
}
FloatingActionButton floatingActionButton() {
return FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
);
}
[@override](/user/override)
Widget buildDesktop(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
actions: [action(1), action(2), action(3)],
),
body: Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Column(
children: [
greenBox(Size(MediaQuery.of(context).size.width * 0.8,
MediaQuery.of(context).size.height * 0.4)),
redBox(Size(MediaQuery.of(context).size.width * 0.8,
MediaQuery.of(context).size.height * 0.4))
],
),
countText(),
],
),
),
floatingActionButton: floatingActionButton());
}
[@override](/user/override)
Widget buildMobile(BuildContext context) {
return Scaffold(
appBar: AppBar(title: countText()),
body: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
action(1),
action(2),
action(3),
greenBox(Size(MediaQuery.of(context).size.width * 0.8,
MediaQuery.of(context).size.width * 0.5)),
redBox(Size(MediaQuery.of(context).size.width * 0.8,
MediaQuery.of(context).size.width * 0.5))
],
),
),
floatingActionButton: floatingActionButton());
}
[@override](/user/override)
Widget buildWideMobileOrTablet(BuildContext context) {
return Scaffold(
appBar: AppBar(title: countText()),
body: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
children: [
action(1),
action(2),
action(3),
],
),
Row(
children: [
greenBox(Size(MediaQuery.of(context).size.width * 0.4,
MediaQuery.of(context).size.width * 0.5)),
redBox(Size(MediaQuery.of(context).size.width * 0.4,
MediaQuery.of(context).size.width * 0.5))
],
)
],
),
),
floatingActionButton: floatingActionButton());
}
[@override](/user/override)
Widget buildWideTabletOrDesktop(BuildContext context) => buildDesktop(context);
}
更多关于Flutter响应式布局插件responsive_page的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter响应式布局插件responsive_page的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
responsive_page
是一个用于在 Flutter 中实现响应式布局的插件。它可以帮助你根据不同的屏幕尺寸和方向来调整 UI 布局,使应用在不同的设备上都能有良好的显示效果。
安装
首先,你需要在 pubspec.yaml
文件中添加 responsive_page
依赖:
dependencies:
flutter:
sdk: flutter
responsive_page: ^0.0.3 # 请查看最新版本
然后运行 flutter pub get
来安装依赖。
基本使用
responsive_page
提供了 ResponsivePage
类,你可以通过继承该类来实现响应式布局。
1. 创建一个响应式页面
import 'package:flutter/material.dart';
import 'package:responsive_page/responsive_page.dart';
class MyResponsivePage extends ResponsivePage {
[@override](/user/override)
Widget buildDesktop(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Desktop View')),
body: Center(child: Text('This is the desktop layout')),
);
}
[@override](/user/override)
Widget buildMobile(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Mobile View')),
body: Center(child: Text('This is the mobile layout')),
);
}
[@override](/user/override)
Widget buildTablet(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Tablet View')),
body: Center(child: Text('This is the tablet layout')),
);
}
}
2. 在应用中加载响应式页面
import 'package:flutter/material.dart';
import 'my_responsive_page.dart'; // 导入你创建的响应式页面
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Responsive Page Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyResponsivePage(),
);
}
}
自定义布局
你可以在 buildDesktop
、buildMobile
和 buildTablet
方法中返回不同的布局,以适应不同的屏幕尺寸。插件会根据当前设备的屏幕尺寸自动选择合适的布局。
高级用法
如果你需要更细粒度的控制,可以使用 ResponsiveBuilder
或 ResponsiveLayout
类。
使用 ResponsiveBuilder
import 'package:flutter/material.dart';
import 'package:responsive_page/responsive_page.dart';
class MyResponsiveWidget extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return ResponsiveBuilder(
builder: (context, screenInfo) {
if (screenInfo.screenType == ScreenType.Desktop) {
return Text('Desktop Layout');
} else if (screenInfo.screenType == ScreenType.Tablet) {
return Text('Tablet Layout');
} else {
return Text('Mobile Layout');
}
},
);
}
}
使用 ResponsiveLayout
import 'package:flutter/material.dart';
import 'package:responsive_page/responsive_page.dart';
class MyResponsiveWidget extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return ResponsiveLayout(
desktop: Text('Desktop Layout'),
tablet: Text('Tablet Layout'),
mobile: Text('Mobile Layout'),
);
}
}