Flutter居中显示单个子视图插件centered_singlechildscrollview的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter居中显示单个子视图插件centered_singlechildscrollview的使用

centered_singlechildscrollview 插件允许你在 SingleChildScrollView 中将单个子视图居中显示。如果子视图比 SingleChildScrollView 小,则它会位于中心。如果子视图较大,则其行为与普通的 SingleChildScrollView 相同。你还可以通过指定 mainAxisAlignment 来改变子视图在滚动方向上的分布方式。

使用示例

首先,你需要在 pubspec.yaml 文件中添加该插件:

dependencies:
  centered_singlechildscrollview: ^1.0.0

然后运行 flutter pub get 来获取该依赖。

接下来,你可以创建一个简单的 Flutter 应用程序,并使用 CenteredSingleChildScrollView 插件来居中显示一个子视图。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:centered_singlechildscrollview/centered_singlechildscrollview.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: const CenteredSingleChildScrollView(
        children: [
          CircularProgressIndicator(), // 这里可以替换为任何其他子视图
        ],
      ),
    );
  }
}

代码解析

  1. 导入必要的库

    import 'package:flutter/material.dart';
    import 'package:centered_singlechildscrollview/centered_singlechildscrollview.dart';
    
  2. 创建主应用类

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: const MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
  3. 创建主页状态类

    class MyHomePage extends StatefulWidget {
      const MyHomePage({super.key, required this.title});
    
      final String title;
    
      @override
      State<MyHomePage> createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: const CenteredSingleChildScrollView(
            children: [
              CircularProgressIndicator(), // 这里可以替换为任何其他子视图
            ],
          ),
        );
      }
    }
    

更多关于Flutter居中显示单个子视图插件centered_singlechildscrollview的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter居中显示单个子视图插件centered_singlechildscrollview的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,centered_singlechildscrollview 是一个自定义的组件,用于在垂直方向上居中显示一个子视图,同时允许该子视图在垂直方向上滚动。虽然 Flutter 官方没有直接提供这个组件,但我们可以自己实现一个类似的组件。

以下是一个简单的实现示例,展示了如何创建一个自定义的 CenteredSingleChildScrollView 组件:

import 'package:flutter/material.dart';

class CenteredSingleChildScrollView extends StatelessWidget {
  final Widget child;

  CenteredSingleChildScrollView({required this.child});

  @override
  Widget build(BuildContext context) {
    return LayoutBuilder(
      builder: (BuildContext context, BoxConstraints constraints) {
        final double availableHeight = constraints.maxHeight;
        final RenderBox childBox = context.findRenderObject() as RenderBox;
        final double childHeight = childBox.size.height;

        final double offset = (availableHeight - childHeight) / 2.0;

        return CustomScrollView(
          slivers: <Widget>[
            SliverPadding(
              padding: EdgeInsets.only(top: offset),
              sliver: SliverToBoxAdapter(
                child: child,
              ),
            ),
          ],
        );
      },
    );
  }
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Centered Single Child Scroll View Example'),
        ),
        body: CenteredSingleChildScrollView(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('This is the top text.'),
              SizedBox(height: 200), // Simulating a large content
              Text('This is the middle text.'),
              SizedBox(height: 200), // Simulating a large content
              Text('This is the bottom text.'),
            ],
          ),
        ),
      ),
    );
  }
}

解释

  1. CenteredSingleChildScrollView:

    • 这是一个自定义的 StatelessWidget
    • 它接收一个 child 参数,这是需要居中显示的子视图。
    • 使用 LayoutBuilder 来获取父容器的可用高度 (availableHeight) 和子视图的高度 (childHeight)。
    • 计算顶部填充 (offset),使得子视图垂直居中。
    • 使用 CustomScrollViewSliverPadding 来应用计算出的顶部填充。
  2. MyApp:

    • 这是一个简单的 Flutter 应用,包含一个 Scaffold 和一个 AppBar
    • Scaffoldbody 中使用 CenteredSingleChildScrollView 包裹一个 Column,其中包含了一些文本和 SizedBox 以模拟较大的内容。

请注意,这个实现假设子视图的高度是固定的或已知的,并且在布局时已经完成测量。如果子视图的高度在运行时发生变化(例如,依赖于动态内容),则可能需要更复杂的逻辑来处理这种情况。

回到顶部