Flutter流体布局插件fluid的使用

Flutter流体布局插件fluid的使用

Fluid(Flutter UI Dependencies)帮助你管理在你的小部件树之外的类的依赖关系及其状态的变化。

Fluid向下填充并根据需要向你的小部件提供数据。

特性

  • 向你的小部件/用户界面提供 Fluid 类。
  • 将来自 Fluid 的数据模型更新作为同步数据流的 Flow 类。

接下来是一个完整的示例,展示如何使用 Fluid 插件来管理依赖关系和数据流。

import 'dart:async';

import 'package:fluid/fluid.dart'; // 注意这里使用了hide关键字以避免冲突
import 'package:flutter/material.dart' hide Flow;

void main() {
  // 创建一个稍后会用到的依赖项
  final ourDependency = MyCoolDependency();
  // 创建一个可以保存实例引用的容器
  final container = SimpleFluidContainer();
  // 注册我们的依赖项到容器中
  container.registerType(ourDependency);
  // 启动flutter应用
  runApp(
    // FluidResolver负责持有我们的容器,并从FluidBuilder小部件创建Fluid
    FluidResolver(
      container: container,
      child: MaterialApp(
        home: Scaffold(
          // FluidBuilder将给我们提供构建上下文和所需的Fluid
          body: FluidBuilder<HomeFluid>(
            builder: (context, fluid) {
              return Center(
                child: Column(
                  mainAxisSize: MainAxisSize.min,
                  children: [
                    // 使用FlowBuilder来重新构建子组件当数据流发出数据时。这将在第一帧开始时始终使用初始数据。
                    FlowBuilder<String>(
                      flow: fluid.greetingFlow,
                      builder: (context, value) {
                        return Text(value);
                      },
                    ),
                    
                    // 我们还将输出映射后的流值
                    FlowBuilder<int>(
                      flow: fluid.lengthOfGreeting,
                      builder: (context, value) {
                        return Text("长度为:$value");
                      },
                    ),
                  ],
                ),
              );
            },
            // FluidFactory对于知道如何创建我们的Fluid非常重要。在这里我们还提供了来自UI的数据(例如名字"Alex")。
            fluidFactory: HomeFluidFactory("Alex"),
          ),
        ),
      ),
    ),
  );
}

/// 工厂用于从UI提供数据并从"外部"获取依赖项。在[createFluid]方法中,我们将访问我们在应用启动前创建的容器。
class HomeFluidFactory extends FluidFactory<HomeFluid> {
  /// 我们将名字保存在一个字段中,以便在调用[createFluid]时使用
  final String name;
  HomeFluidFactory(this.name);

  [@override](/user/override)
  HomeFluid createFluid(FluidContainer container) {
    // 返回一个新的HomeFluid实例,我们可以使用容器获取[MyCoolDependency]的实例
    return HomeFluid(container.getInstance<MyCoolDependency>(), name);
  }
}

/// 这个逻辑组件包含我们的数据,并且能够从定义的小部件树之外的容器获取依赖项
class HomeFluid extends Fluid {
  late final Flow<String> greetingFlow;
  late final Flow<int> lengthOfGreeting;
  final String name;

  /// 创建一个新的HomeFluid实例,注意对[MyCoolDependency]和字符串名字的依赖
  HomeFluid(MyCoolDependency helloDependency, this.name) {
    final valueFlow = ValueFlow("Hi! 正在加载...");
    greetingFlow = valueFlow;
    // 创建一个流,将问候语映射为其长度
    lengthOfGreeting = valueFlow.map(
      (value) => value.length,
    );
    // 在微任务中异步加载问候语并更新问候文本。问候长度会自动更新
    scheduleMicrotask(() async {
      final greeting = await helloDependency.sayHello(name);
      valueFlow.emit(greeting);
    });
  }
}

/// 一个通用类,没有Flutter知识。它可能是我们的API,一个从存储中获取数据的类或其他任何我们不想与小部件/视图绑定的东西
class MyCoolDependency {
  Future<String> sayHello(String name) async {
    // 模拟从API延迟响应
    await Future.delayed(const Duration(seconds: 2));
    return "你好 $name";
  }
}

更多关于Flutter流体布局插件fluid的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter流体布局插件fluid的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,fluid 并不是一个官方提供的布局插件,但通常开发者可能会提及“流体布局”来指代能够自适应屏幕大小变化的布局方式。在Flutter中,这通常可以通过使用FlexibleExpandedFittedBoxAspectRatio等组件来实现。

不过,如果你是在寻找一个第三方库来实现更高级的流体布局效果,你可能需要具体指明是哪个库,因为Flutter社区中有很多第三方库,每个库都有其特定的用法。

但基于你提到的“流体布局”,这里我将展示如何使用Flutter内置的布局组件来实现一个简单的流体布局效果。假设我们想要创建一个可以根据屏幕大小自动调整其子组件大小的布局。

使用RowExpanded实现流体布局

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Fluid Layout Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Row(
            children: <Widget>[
              // 第一个子组件占据剩余空间的1/3
              Expanded(
                flex: 1,
                child: Container(
                  color: Colors.blue,
                  child: Center(
                    child: Text(
                      '1/3',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
              ),
              // 垂直分隔线
              VerticalDivider(width: 8.0),
              // 第二个子组件占据剩余空间的2/3
              Expanded(
                flex: 2,
                child: Container(
                  color: Colors.green,
                  child: Center(
                    child: Text(
                      '2/3',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个例子中,我们使用了Row来水平排列子组件,并使用Expanded来使子组件根据剩余空间的比例来分配大小。flex属性决定了每个Expanded子组件应该占据多少比例的空间。

使用ColumnFlexible实现垂直流体布局

类似地,我们可以使用ColumnFlexible来实现垂直方向的流体布局:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Vertical Fluid Layout Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            children: <Widget>[
              // 第一个子组件占据剩余空间的1/4
              Flexible(
                flex: 1,
                child: Container(
                  color: Colors.red,
                  child: Center(
                    child: Text(
                      '1/4',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
              ),
              // 第二个子组件占据剩余空间的3/4
              Flexible(
                flex: 3,
                child: Container(
                  color: Colors.purple,
                  child: Center(
                    child: Text(
                      '3/4',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个例子中,我们使用了Column来垂直排列子组件,并使用Flexible来使子组件根据剩余空间的比例来分配大小。

这些例子展示了如何使用Flutter内置的布局组件来实现流体布局效果。如果你确实在寻找一个特定的第三方库,请提供更多细节,以便我能给出更准确的代码示例。

回到顶部