Flutter 基础知识(一)

一、Flutter 基础

1. Flutter 是什么?它的优点有哪些?

答:

Flutter 是 Google 开源的 UI 框架,可用于构建 iOS、Android、Web、Windows、Mac、Linux 应用。

优点:

• 跨平台开发:一套代码可运行在多个平台。

• 高性能:使用 Skia 引擎,接近原生性能。

• 热重载(Hot Reload) :提高开发效率。

• 丰富的 UI 组件:支持 Material 和 Cupertino 组件。

• 自绘 UI:不依赖原生控件,UI 渲染一致性强。


2. Flutter 的核心架构是什么?

答:

Flutter 主要由以下层组成:

• Dart Framework(框架层) :包含 Widget、Animation、Material/Cupertino 组件等。

• Engine(引擎层) :C++ 编写,包含 Skia 渲染引擎、Dart 运行时等。

• Embedder(嵌入层) :针对不同平台的适配,如 Android(JNI)、iOS(Objective-C/Swift)。


3. StatefulWidget 和 StatelessWidget 的区别?

区别 StatefulWidget StatelessWidget
状态 有可变状态(State) 无状态
适用场景 需要动态更新 UI(如表单、动画) UI 固定,数据不会变化
例子 计数器(Counter)、动画控件 静态文本、图标等

示例代码

scala 复制代码
// StatelessWidget 示例
class MyStatelessWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Text("我是无状态组件");
  }
}

// StatefulWidget 示例
class MyStatefulWidget extends StatefulWidget {
  @override
  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text("计数: $count"),
        ElevatedButton(
          onPressed: () {
            setState(() {
              count++;
            });
          },
          child: Text("增加计数"),
        ),
      ],
    );
  }
}

4. setState() 的作用是什么?

答:

setState() 用于通知 Flutter 框架,当前组件的状态发生了变化,需要重新构建 UI。

示例:

ini 复制代码
setState(() {
  count++;
});

注意:

• 只能在 State 类中使用。

• 尽量减少 setState 的作用范围,以提高性能。


5. Flutter 的生命周期有哪些?

答:

StatefulWidget 的生命周期:

  1. createState() → 创建 State 实例。

  2. initState() → 组件初始化,仅执行一次。

  3. didChangeDependencies() → 依赖变化时触发(如 InheritedWidget)。

  4. build() → 重新构建 UI。

  5. didUpdateWidget() → 当父组件重建时调用。

  6. deactivate() → 组件被移除时调用。

  7. dispose() → 组件销毁,释放资源(如 Controller)。

示例

scss 复制代码
@override
void initState() {
  super.initState();
  print("组件初始化");
}

@override
void dispose() {
  print("组件销毁");
  super.dispose();
}

6. Flutter 如何实现页面跳转(导航)?

答:

使用 Navigator.push() 和 Navigator.pop() 进行页面管理。

示例

scss 复制代码
// 跳转页面
Navigator.push(
  context,
  MaterialPageRoute(builder: (context) => SecondPage()),
);

// 返回上一个页面
Navigator.pop(context);

命名路由

javascript 复制代码
// 定义路由
void main() {
  runApp(MaterialApp(
    initialRoute: '/',
    routes: {
      '/': (context) => HomePage(),
      '/second': (context) => SecondPage(),
    },
  ));
}

// 跳转
Navigator.pushNamed(context, '/second');

7. Flutter 中 Future 和 async/await 的作用?

答:

• Future 代表 异步操作(如网络请求、文件 IO)。

• async/await 用于 等待异步任务完成,避免回调地狱。

示例

csharp 复制代码
Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2));
  return "数据加载完成";
}

void load() async {
  String result = await fetchData();
  print(result);
}

8. Flutter 如何与 Native 交互?

答:

• MethodChannel:用于 Dart 与 Native 通信。

• EventChannel :适用于 Native 向 Flutter 发送数据流。

• BasicMessageChannel:双向通信(传输字符串、JSON)。

示例(Android 调用 Flutter 方法)

ini 复制代码
const MethodChannel _channel = MethodChannel('com.example.channel');

Future<String> getNativeData() async {
  final String result = await _channel.invokeMethod('getData');
  return result;
}

Android 端(Kotlin)

kotlin 复制代码
class MainActivity : FlutterActivity() {
    private val channel = "com.example.channel"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, channel)
            .setMethodCallHandler { call, result ->
                if (call.method == "getData") {
                    result.success("来自 Android 的数据")
                }
            }
    }
}

三、Flutter 性能优化

9. Flutter 性能优化方法?

答:

  1. 避免 setState 过度使用

• 仅更新需要刷新的部分,使用 ValueNotifier 或 Provider 代替 setState。

  1. 使用 const 优化

• 避免不必要的 widget 重新构建。

arduino 复制代码
const Text("我是静态文本");
  1. 使用 ListView.builder

• 避免一次性渲染大量 ListTile。

  1. 使用 RepaintBoundary

• 限制局部重绘区域,提高渲染性能。


10. Flutter 状态管理方式有哪些?

答:

• Provider(推荐):官方支持,轻量级。

• Riverpod:Provider 的升级版,无需 BuildContext。

• GetX:语法简洁,集成路由管理。

• Bloc/Cubit:适用于大型项目,状态流管理。

Provider 示例

scala 复制代码
class Counter with ChangeNotifier {
  int _count = 0;
  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }
}

// 使用 Provider
Consumer<Counter>(
  builder: (context, counter, child) {
    return Text('计数: ${counter.count}');
  },
);
相关推荐
前端snow15 分钟前
ai agent --- 异步处理之 Rabbit MQ
前端
念何架构之路19 分钟前
zap扩展生态与总结
java·前端·数据库
独孤九剑打醒他33 分钟前
【原创开源】【概念设计】源 - 栅 - 漏 - 栅 - 源 横向双栅 MOS,低压交流多值逻辑芯片探索
前端·其他·架构·开源·硬件工程
mantou1321 小时前
我给 AI Agent 做了个「油猴」:让 Claude Code / Codex 直接用你已登录的浏览器
前端·javascript·后端
默_笙1 小时前
🍕 一个主编、三个工种、两本手册:搭一支 AI 调研队
前端·javascript
纸片人1 小时前
Blender 建模 + Three.js 展示:和 AI 一起做一个光储充超充站数字孪生大屏
前端
智能直播1 小时前
网络RTMP拉流不卡顿、声音不同步?一文讲透缓冲区、时间戳与MEDAI V2实战调优
前端
第七页独白1 小时前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库
纸片人1 小时前
只用 three.js + OpenStreetMap,手搓一个「成都城市 3D」数据大屏
前端
星若生辉1 小时前
Hugo 静态站点搭建|从本地调试到上线部署实操指南
前端