Flutter Series Articles - Advanced Flutter

In the previous two articles, we have learned the basics of Flutter, including Flutter's design concept, framework structure, Widget system, basic Widgets and layout. In this article, we'll explore advanced Flutter topics further, including handling user interactions, creating animations, accessing network data, and more. In order to better understand these concepts, we will explain in detail through the actual sample code.

1. Handle user interaction

In mobile applications, user interaction is a very important part. Flutter provides a wealth of Widgets to handle user interaction events such as touch, click, and gestures.

1. Gesture recognition

Flutter provides GestureDetector Widget to recognize various gestures, such as click, long press, double click, etc. Here is a simple example showing how to change the text content on button click:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TapExample(),
    );
  }
}

class TapExample extends StatefulWidget {
  @override
  _TapExampleState createState() => _TapExampleState();
}

class _TapExampleState extends State<TapExample> {
  String _text = 'Click the button';

  void _handleTap() {
    setState(() {
      _text = 'Button Clicked';
    });
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: _handleTap,
      child: Container(
        padding: EdgeInsets.all(12),
        color: Colors.blue,
        child: Text(
          _text,
          style: TextStyle(
            color: Colors.white,
            fontSize: 18,
          ),
        ),
      ),
    );
  }
}

In the above code, we use GestureDetector to wrap a Container. When the user clicks on the Container, the _handleTap function will be called, and the text will change to 'Button Clicked'.

2. Drag gesture

Flutter also supports drag gestures, you can use Draggable and DragTarget to implement drag and drop operations. Here's a simple example showing how to drag a small square from one container to another:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DragExample(),
    );
  }
}

class DragExample extends StatefulWidget {
  @override
  _DragExampleState createState() => _DragExampleState();
}

class _DragExampleState extends State<DragExample> {
  bool _dragging = false;
  Offset _position = Offset(0, 0);

  void _handleDrag(DragUpdateDetails details) {
    setState(() {
      _position = _position + details.delta;
    });
  }

  void _handleDragStart() {
    setState(() {
      _dragging = true;
    });
  }

  void _handleDragEnd() {
    setState(() {
      _dragging = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: [
        Positioned(
          left: _position.dx,
          top: _position.dy,
          child: Draggable(
            onDragStarted: _handleDragStart,
            onDragEnd: (_) => _handleDragEnd(), // 修改为不带参数的形式
            onDragUpdate: _handleDrag,
            child: Container(
              width: 100,
              height: 100,
              color: Colors.blue,
            ),
            feedback: Container(
              width: 100,
              height: 100,
              color: Colors.blue.withOpacity(0.5),
            ),
            childWhenDragging: Container(),
          ),
        ),
        Center(
          child: DragTarget(
            onAccept: (value) {
              setState(() {
                _position = Offset(0, 0);
              });
            },
            builder: (context, candidates, rejected) {
              return Container(
                width: 200,
                height: 200,
                color: Colors.grey,
              );
            },
          ),
        ),
      ],
    );
  }
}

In the above code, we use Draggable to wrap a small blue square and drag it to the DragTarget. When the drag ends, the small square will return to the center of the DragTarget.

2. Create animation

Flutter provides powerful animation support, you can use AnimationController and Tween to create various animation effects. Here is a simple example showing how to use AnimationController and Tween to implement a color gradient animation:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ColorTweenExample(),
    );
  }
}

class ColorTweenExample extends StatefulWidget {
  @override
  _ColorTweenExampleState createState() => _ColorTweenExampleState();
}

class _ColorTweenExampleState extends State<ColorTweenExample>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<Color?> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      vsync: this,
      duration: Duration(seconds: 2),
    );
    _animation = ColorTween(begin: Colors.blue, end: Colors.red)
        .animate(CurvedAnimation(parent: _controller, curve: Curves.easeInOut));
    _controller.repeat(reverse: true);
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ColorTween Example'),
      ),
      body: Center(
        child: AnimatedBuilder(
          animation: _animation,
          builder: (context, child) {
            return Container(
              width: 200,
              height: 200,
              color: _animation.value,
            );
          },
        ),
      ),
    );
  }
}

In the above code, we use AnimationController and ColorTween to create a color gradient animation that gradually changes the blue container to red.

3. Access to network data

Accessing network data is a common requirement in modern applications. Flutter provides the http package to handle network requests. The following is a simple example that demonstrates how to use the http package to fetch JSON data and display it in a ListView:

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HttpExample(),
    );
  }
}

class HttpExample extends StatefulWidget {
  @override
  _HttpExampleState createState() => _HttpExampleState();
}

class _HttpExampleState extends State<HttpExample> {
  List<dynamic> _data = [];

  @override
  void initState() {
    super.initState();
    _getData();
  }

  Future<void> _getData() async {
    final response =
        await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts'));
    if (response.statusCode == 200) {
      setState(() {
        _data = json.decode(response.body);
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('HTTP Example'),
      ),
      body: ListView.builder(
        itemCount: _data.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(_data[index]['title']),
            subtitle: Text(_data[index]['body']),
          );
        },
      ),
    );
  }
}

In the above code, we use the http package to obtain JSON data, and display the data in the ListView after parsing.

conclusion

Through the study of this article, you have learned about advanced topics of Flutter, including handling user interaction, creating animations, and accessing network data. This knowledge will help you gain a deeper understanding of Flutter's development capabilities and add more features and interactive experiences to your applications. I hope this article helps you on your Flutter learning journey, and I wish you more success in the world of Flutter!

Guess you like

Origin blog.csdn.net/xudepeng0813/article/details/131940327